Example #1
0
/* FIXME: needs comment: */
static void
dump_value_to_file(const char *cmd, const char *mode, const char *file_format)
{
  struct cleanup *old_cleanups = make_cleanup(null_cleanup, NULL);
  struct value *val;
  char *filename;

  /* Open the file.  */
  filename = scan_filename_with_cleanup(&cmd, NULL);

  /* Find the value: */
  if ((cmd == NULL) || (*cmd == '\0'))
    error(_("No value to %s."), ((*mode == 'a') ? "append" : "dump"));
  val = parse_and_eval(cmd);
  if (val == NULL)
    error(_("Invalid expression."));

  /* Have everything.  Open/write the data: */
  if ((file_format == NULL) || (strcmp(file_format, "binary") == 0))
    {
      dump_binary_file(filename, mode, value_contents(val),
                       TYPE_LENGTH(value_type(val)));
    }
  else
    {
      CORE_ADDR vaddr;

      if (VALUE_LVAL(val))
	{
	  vaddr = VALUE_ADDRESS(val);
	}
      else
	{
	  vaddr = 0;
	  warning(_("value is not an lval: address assumed to be zero"));
	}

      dump_bfd_file(filename, mode, file_format, vaddr,
		    value_contents(val),
		    TYPE_LENGTH(value_type(val)));
    }

  do_cleanups(old_cleanups);
}
Example #2
0
int run_tests()
{
    /* 1) Complex string */
    snprintf(str, 256, "y=26*2/2+log10(pi)+2.*pow(2,1*(3+7*.1)*1.1+x{0}[0])*3*4+cos(2.)");
    setup_test('f', 1, 'f', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %g\n", 26*2/2+log10f(M_PI)+2.f
            *powf(2,1*(3+7*.1f)*1.1f+src_float[0])*3*4+cosf(2.0f));

    /* 2) Building vectors, conditionals */
    snprintf(str, 256, "y=(x>1)?[1,2,3]:[2,4,6]");
    setup_test('f', 3, 'i', 3);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%i, %i, %i]\n", src_float[0]>1?1:2, src_float[1]>1?2:4,
           src_float[2]>1?3:6);

    /* 3) Conditionals with shortened syntax */
    snprintf(str, 256, "y=x?:123");
    setup_test('f', 1, 'i', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %i\n", (int)src_float[0]?:123);

    /* 4) Conditional that should be optimized */
    snprintf(str, 256, "y=1?2:123");
    setup_test('f', 1, 'i', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: 2\n");

    /* 5) Building vectors with variables, operations inside vector-builder */
    snprintf(str, 256, "y=[x*-2+1,0]");
    setup_test('i', 2, 'd', 3);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%g, %g, %g]\n", (double)src_int[0]*-2+1,
            (double)src_int[1]*-2+1, 0.0);

    /* 6) Building vectors with variables, operations inside vector-builder */
    snprintf(str, 256, "y=[-99.4, -x*1.1+x]");
    setup_test('i', 2, 'd', 3);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%g, %g, %g]\n", -99.4,
            (double)(-src_int[0]*1.1+src_int[0]),
            (double)(-src_int[1]*1.1+src_int[1]));

    /* 7) Indexing vectors by range */
    snprintf(str, 256, "y=x[1:2]+100");
    setup_test('d', 3, 'f', 2);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%g, %g]\n", (float)src_double[1]+100,
           (float)src_double[2]+100);

    /* 8) Typical linear scaling expression with vectors */
    snprintf(str, 256, "y=x*[0.1,3.7,-.1112]+[2,1.3,9000]");
    setup_test('f', 3, 'f', 3);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%g, %g, %g]\n", src_float[0]*0.1f+2.f,
            src_float[1]*3.7f+1.3f, src_float[2]*-.1112f+9000.f);

    /* 9) Check type and vector length promotion of operation sequences */
    snprintf(str, 256, "y=1+2*3-4*x");
    setup_test('f', 2, 'f', 2);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%g, %g]\n", 1.f+2.f*3.f-4.f*src_float[0],
            1.f+2.f*3.f-4.f*src_float[1]);

    /* 10) Swizzling, more pre-computation */
    snprintf(str, 256, "y=[x[2],x[0]]*0+1+12");
    setup_test('f', 3, 'f', 2);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%g, %g]\n", src_float[2]*0.f+1.f+12.f,
            src_float[0]*0.f+1.f+12.f);

    /* 11) Logical negation */
    snprintf(str, 256, "y=!(x[1]*0)");
    setup_test('d', 3, 'i', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %i\n", (int)!(src_double[1]*0));

    /* 12) any() */
    snprintf(str, 256, "y=any(x-1)");
    setup_test('d', 3, 'i', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %i\n", ((int)src_double[0]-1)?1:0
           | ((int)src_double[1]-1)?1:0
           | ((int)src_double[2]-1)?1:0);

    /* 13) all() */
    snprintf(str, 256, "y=x[2]*all(x-1)");
    setup_test('d', 3, 'i', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    int temp = ((int)src_double[0]-1)?1:0 & ((int)src_double[1]-1)?1:0
                & ((int)src_double[2]-1)?1:0;
    eprintf("Expected: %i\n", (int)src_double[2] * temp);

    /* 14) pi and e, extra spaces */
    snprintf(str, 256, "y=x + pi -     e");
    setup_test('d', 1, 'f', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %g\n", (float)(src_double[0]+M_PI-M_E));

    /* 15) Bad vector notation */
    snprintf(str, 256, "y=(x-2)[1]");
    setup_test('i', 1, 'i', 1);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 16) Vector index outside bounds */
    snprintf(str, 256, "y=x[3]");
    setup_test('i', 3, 'i', 1);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 17) Vector length mismatch */
    snprintf(str, 256, "y=x[1:2]");
    setup_test('i', 3, 'i', 1);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 18) Unnecessary vector notation */
    snprintf(str, 256, "y=x+[1]");
    setup_test('i', 1, 'i', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %i\n", src_int[0]+1);

    /* 19) Invalid history index */
    snprintf(str, 256, "y=x{-101}");
    setup_test('i', 1, 'i', 1);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 20) Invalid history index */
    snprintf(str, 256, "y=x-y{-101}");
    setup_test('i', 1, 'i', 1);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 21) Scientific notation */
    snprintf(str, 256, "y=x[1]*1.23e-20");
    setup_test('i', 2, 'd', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %g\n", (double)src_int[1] * 1.23e-20);

    /* 22) Vector assignment */
    snprintf(str, 256, "y[1]=x[1]");
    setup_test('d', 3, 'i', 3);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [NULL, %i, NULL]\n", (int)src_double[1]);

    /* 23) Vector assignment */
    snprintf(str, 256, "y[1:2]=[x[1],10]");
    setup_test('d', 3, 'i', 3);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [NULL, %i, %i]\n", (int)src_double[1], 10);

    /* 24) Output vector swizzling */
    snprintf(str, 256, "[y[0],y[2]]=x[1:2]");
    setup_test('f', 3, 'd', 3);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%g, NULL, %g]\n", (double)src_float[1],
            (double)src_float[2]);

    /* 25) Multiple expressions */
    snprintf(str, 256, "y[0]=x*100-23.5; y[2]=100-x*6.7");
    setup_test('i', 1, 'f', 3);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 26) Error check: separating sub-expressions with commas */
    snprintf(str, 256, "foo=1,  y=y{-1}+foo");
    setup_test('i', 1, 'f', 1);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 27) Initialize filters */
    snprintf(str, 256, "y=x+y{-1}; y{-1}=100");
    setup_test('i', 1, 'i', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %i\n", src_int[0]*iterations + 100);

    /* 28) Initialize filters + vector index */
    snprintf(str, 256, "y=x+y{-1}; y[1]{-1}=100");
    setup_test('i', 2, 'i', 2);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%i, %i]\n", src_int[0]*iterations,
            src_int[1]*iterations + 100);

    /* 29) Initialize filters + vector index */
    snprintf(str, 256, "y=x+y{-1}; y{-1}=[100,101]");
    setup_test('i', 2, 'i', 2);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%i, %i]\n", src_int[0]*iterations + 100,
            src_int[1]*iterations + 101);

    /* 30) Initialize filters */
    snprintf(str, 256, "y=x+y{-1}; y[0]{-1}=100; y[2]{-1}=200");
    setup_test('i', 3, 'i', 3);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [%i, %i, %i]\n", src_int[0]*iterations + 100,
            src_int[1]*iterations, src_int[2]*iterations + 200);

    /* 31) Initialize filters */
    snprintf(str, 256, "y=x+y{-1}-y{-2}; y{-1}=[100,101]; y{-2}=[100,101]");
    setup_test('i', 2, 'i', 2);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [1, 2]\n");

    /* 32) Only initialize */
    snprintf(str, 256, "y{-1}=100");
    setup_test('i', 3, 'i', 1);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 33) Bad syntax */
    snprintf(str, 256, " ");
    setup_test('i', 1, 'f', 3);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 34) Bad syntax */
    snprintf(str, 256, " ");
    setup_test('i', 1, 'f', 3);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 35) Bad syntax */
    snprintf(str, 256, "y");
    setup_test('i', 1, 'f', 3);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 36) Bad syntax */
    snprintf(str, 256, "y=");
    setup_test('i', 1, 'f', 3);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 37) Bad syntax */
    snprintf(str, 256, "=x");
    setup_test('i', 1, 'f', 3);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 38) sin */
    snprintf(str, 256, "sin(x)");
    setup_test('i', 1, 'f', 3);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 39) Variable declaration */
    snprintf(str, 256, "y=x+var; var=[3.5,0]");
    setup_test('i', 2, 'f', 2);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %g\n", (float)src_int[0] + 3.5);

    /* 40) Variable declaration */
    snprintf(str, 256, "ema=ema{-1}*0.9+x*0.1; y=ema*2; ema{-1}=90");
    setup_test('i', 1, 'f', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: 2\n");

    /* 41) Multiple variable declaration */
    snprintf(str, 256, "a=1.1; b=2.2; c=3.3; y=x+a-b*c");
    setup_test('i', 1, 'f', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %g\n", (float)src_int[0] + 1.1 - 2.2 * 3.3);

    /* 42) Malformed variable declaration */
    snprintf(str, 256, "y=x + myvariable * 10");
    setup_test('i', 1, 'f', 1);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 43) Vector functions mean() and sum() */
    snprintf(str, 256, "y=mean(x)==(sum(x)/3)");
    setup_test('f', 3, 'i', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %i\n", 1);

    /* 44) Overloaded vector functions max() and min() */
    snprintf(str, 256, "y=max(x)-min(x)*max(x[0],1)");
    setup_test('f', 3, 'i', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: %i\n",
            ((src_float[0]>src_float[1])?
             (src_float[0]>src_float[2]?(int)src_float[0]:(int)src_float[2]):
             (src_float[1]>src_float[2]?(int)src_float[1]:(int)src_float[2])) -
            ((src_float[0]<src_float[1])?
             (src_float[0]<src_float[2]?(int)src_float[0]:(int)src_float[2]):
             (src_float[1]<src_float[2]?(int)src_float[1]:(int)src_float[2])));

    /* 45) Optimization: operations by zero */
    snprintf(str, 256, "y=0*sin(x)*200+1.1");
    setup_test('i', 1, 'f', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: 1.1\n");

    /* 46) Optimization: operations by one */
    snprintf(str, 256, "y=x*1");
    setup_test('i', 1, 'f', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: 1\n");

    /* 47) Error check: division by zero */
    snprintf(str, 256, "y=x/0");
    setup_test('i', 1, 'f', 1);
    if (parse_and_eval(EXPECT_FAILURE))
        return 1;
    eprintf("Expected: FAILURE\n");

    /* 48) Multiple Inputs */
    snprintf(str, 256, "y=x+x1[1:2]+x2");
    char types[] = {'i', 'f', 'd'};
    int lengths[] = {2, 3, 2};
    setup_test_multisource(3, types, lengths, 'f', 2);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: [4, 7]\n");

    /* 49) Functions with memory: ema() */
    snprintf(str, 256, "y=x-ema(x,0.1)+2");
    setup_test('i', 1, 'f', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    eprintf("Expected: ->2\n");

    /* 50) Functions with memory: schmitt() */
    snprintf(str, 256, "y=y{-1}+(schmitt(y{-1},20,80)?-1:1)");
    setup_test('i', 1, 'f', 1);
    if (parse_and_eval(EXPECT_SUCCESS))
        return 1;
    if (iterations < 80)
        eprintf("Expected: %d\n", iterations);
    else {
        int cycles = (iterations-20) / 60;
        int remainder = (iterations-20) % 60;
        eprintf("Expected: %d\n", (cycles % 2) ? 80 - remainder : 20 + remainder);
    }

    return 0;
}
Example #3
0
int run_tests()
{
    int result = 0;

    /* Complex string */
    snprintf(str, 256, "y=26*2/2+log10(pi)+2.*pow(2,1*(3+7*.1)*1.1+x{0}[0])*3*4+cos(2.)");
    setup_test('f', 1, 1, src_float, 'f', 1, 1, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %g\n", 26*2/2+log10f(M_PI)+2.f
            *powf(2,1*(3+7*.1f)*1.1f+src_float[0])*3*4+cosf(2.0f));

    /* Building vectors, conditionals */
    snprintf(str, 256, "y=(x>1)?[1,2,3]:[2,4,6]");
    setup_test('f', 1, 3, src_float, 'i', 1, 3, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%i, %i, %i]\n", src_float[0]>1?1:2, src_float[1]>1?2:4,
           src_float[2]>1?3:6);

    /* Conditionals with shortened syntax */
    snprintf(str, 256, "y=x?:123");
    setup_test('f', 1, 1, src_float, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %i\n", (int)src_float[0]?:123);

    /* Conditional that should be optimized */
    snprintf(str, 256, "y=1?2:123");
    setup_test('f', 1, 1, src_float, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: 2\n");

    /* Building vectors with variables, operations inside vector-builder */
    snprintf(str, 256, "y=[x*-2+1,0]");
    setup_test('i', 1, 2, src_int, 'd', 1, 3, dest_double);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%g, %g, %g]\n", (double)src_int[0]*-2+1,
            (double)src_int[1]*-2+1, 0.0);

    /* Building vectors with variables, operations inside vector-builder */
    snprintf(str, 256, "y=[-99.4, -x*1.1+x]");
    setup_test('i', 1, 2, src_int, 'd', 1, 3, dest_double);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%g, %g, %g]\n", -99.4,
            (double)(-src_int[0]*1.1+src_int[0]),
            (double)(-src_int[1]*1.1+src_int[1]));

    /* Indexing vectors by range */
    snprintf(str, 256, "y=x[1:2]+100");
    setup_test('d', 1, 3, src_double, 'f', 1, 2, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%g, %g]\n", (float)src_double[1]+100,
           (float)src_double[2]+100);

    /* Typical linear scaling expression with vectors */
    snprintf(str, 256, "y=x*[0.1,3.7,-.1112]+[2,1.3,9000]");
    setup_test('f', 1, 3, src_float, 'f', 1, 3, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%g, %g, %g]\n", src_float[0]*0.1f+2.f,
            src_float[1]*3.7f+1.3f, src_float[2]*-.1112f+9000.f);

    /* Check type and vector length promotion of operation sequences */
    snprintf(str, 256, "y=1+2*3-4*x");
    setup_test('f', 1, 2, src_float, 'f', 1, 2, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%g, %g]\n", 1.f+2.f*3.f-4.f*src_float[0],
            1.f+2.f*3.f-4.f*src_float[1]);

    /* Swizzling, more pre-computation */
    snprintf(str, 256, "y=[x[2],x[0]]*0+1+12");
    setup_test('f', 1, 3, src_float, 'f', 1, 2, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%g, %g]\n", src_float[2]*0.f+1.f+12.f,
            src_float[0]*0.f+1.f+12.f);

    /* Logical negation */
    snprintf(str, 256, "y=!(x[1]*0)");
    setup_test('d', 1, 3, src_double, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %i\n", (int)!(src_double[1]*0));

    /* any() */
    snprintf(str, 256, "y=any(x-1)");
    setup_test('d', 1, 3, src_double, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %i\n", ((int)src_double[0]-1)?1:0
           | ((int)src_double[1]-1)?1:0
           | ((int)src_double[2]-1)?1:0);

    /* all() */
    snprintf(str, 256, "y=x[2]*all(x-1)");
    setup_test('d', 1, 3, src_double, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    int temp = ((int)src_double[0]-1)?1:0 & ((int)src_double[1]-1)?1:0
                & ((int)src_double[2]-1)?1:0;
    eprintf("Expected: %i\n", (int)src_double[2] * temp);

    /* pi and e, extra spaces */
    snprintf(str, 256, "y=x + pi -     e");
    setup_test('d', 1, 1, src_double, 'f', 1, 1, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %g\n", (float)(src_double[0]+M_PI-M_E));

    /* bad vector notation */
    snprintf(str, 256, "y=(x-2)[1]");
    setup_test('i', 1, 1, src_int, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* vector index outside bounds */
    snprintf(str, 256, "y=x[3]");
    setup_test('i', 1, 3, src_int, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* vector length mismatch */
    snprintf(str, 256, "y=x[1:2]");
    setup_test('i', 1, 3, src_int, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* unnecessary vector notation */
    snprintf(str, 256, "y=x+[1]");
    setup_test('i', 1, 1, src_int, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %i\n", src_int[0]+1);

    /* invalid history index */
    snprintf(str, 256, "y=x{-101}");
    setup_test('i', 1, 1, src_int, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* invalid history index */
    snprintf(str, 256, "y=x-y{-101}");
    setup_test('i', 1, 1, src_int, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* scientific notation */
    snprintf(str, 256, "y=x[1]*1.23e-20");
    setup_test('i', 1, 2, src_int, 'd', 1, 1, dest_double);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %g\n", (double)src_int[1] * 1.23e-20);

    /* Vector assignment */
    snprintf(str, 256, "y[1]=x[1]");
    setup_test('d', 1, 3, src_double, 'i', 1, 3, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [NULL, %i, NULL]\n", (int)src_double[1]);

    /* Vector assignment */
    snprintf(str, 256, "y[1:2]=[x[1],10]");
    setup_test('d', 1, 3, src_double, 'i', 1, 3, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [NULL, %i, %i]\n", (int)src_double[1], 10);

    /* Output vector swizzling */
    snprintf(str, 256, "[y[0],y[2]]=x[1:2]");
    setup_test('f', 1, 3, src_float, 'd', 1, 3, dest_double);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%g, NULL, %g]\n", (double)src_float[1],
            (double)src_float[2]);

    /* Multiple expressions */
    snprintf(str, 256, "y[0]=x*100-23.5; y[2]=100-x*6.7");
    setup_test('i', 1, 1, src_int, 'f', 1, 3, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* Error check: separating sub-expressions with commas */
    snprintf(str, 256, "foo=1,  y=y{-1}+foo");
    setup_test('i', 1, 1, src_int, 'f', 1, 1, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* Initialize filters */
    snprintf(str, 256, "y=x+y{-1}; y{-1}=100");
    setup_test('i', 1, 1, src_int, 'i', 2, 1, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %i\n", src_int[0]*iterations + 100);

    /* Initialize filters + vector index */
    snprintf(str, 256, "y=x+y{-1}; y[1]{-1}=100");
    setup_test('i', 1, 2, src_int, 'i', 2, 2, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%i, %i]\n", src_int[0]*iterations,
            src_int[1]*iterations + 100);

    /* Initialize filters + vector index */
    snprintf(str, 256, "y=x+y{-1}; y{-1}=[100,101]");
    setup_test('i', 1, 2, src_int, 'i', 2, 2, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%i, %i]\n", src_int[0]*iterations + 100,
            src_int[1]*iterations + 101);

    /* Initialize filters */
    snprintf(str, 256, "y=x+y{-1}; y[0]{-1}=100; y[2]{-1}=200");
    setup_test('i', 1, 3, src_int, 'i', 2, 3, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [%i, %i, %i]\n", src_int[0]*iterations + 100,
            src_int[1]*iterations, src_int[2]*iterations + 200);

    /* Initialize filters */
    snprintf(str, 256, "y=x+y{-1}-y{-2}; y{-1}=[100,101]; y{-2}=[100,101]");
    setup_test('i', 1, 2, src_int, 'i', 3, 2, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: [1, 2]\n");

    /* Only initialize */
    snprintf(str, 256, "y{-1}=100");
    setup_test('i', 1, 3, src_int, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* Some examples of bad syntax */
    strcpy(str, "");
    setup_test('i', 1, 1, src_int, 'f', 1, 3, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");
    snprintf(str, 256, " ");
    setup_test('i', 1, 1, src_int, 'f', 1, 3, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");
    snprintf(str, 256, "y");
    setup_test('i', 1, 1, src_int, 'f', 1, 3, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");
    snprintf(str, 256, "y=");
    setup_test('i', 1, 1, src_int, 'f', 1, 3, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");
    snprintf(str, 256, "=x");
    setup_test('i', 1, 1, src_int, 'f', 1, 3, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");
    snprintf(str, 256, "sin(x)");
    setup_test('i', 1, 1, src_int, 'f', 1, 3, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* Variable declaration */
    snprintf(str, 256, "var=3.5; y=x+var");
    setup_test('i', 1, 1, src_int, 'f', 1, 1, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %g\n", (float)src_int[0] + 3.5);

    /* Variable declaration */
    snprintf(str, 256, "ema=ema{-1}*0.9+x*0.1; y=ema*2; ema{-1}=90");
    setup_test('i', 1, 1, src_int, 'f', 1, 1, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: 2\n");

    /* Use of uninitialized variable */
    snprintf(str, 256, "y=x + myvariable * 10");
    setup_test('i', 1, 1, src_int, 'f', 1, 1, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    /* Vector functions mean() and sum() */
    snprintf(str, 256, "y=mean(x)==(sum(x)/3)");
    setup_test('f', 1, 3, src_float, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %i\n", 1);

    /* Overloaded vector functions max() and min() */
    snprintf(str, 256, "y=max(x)-min(x)");
    setup_test('f', 1, 3, src_float, 'i', 1, 1, dest_int);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: %i\n",
            ((src_float[0]>src_float[1])?
             (src_float[0]>src_float[2]?(int)src_float[0]:(int)src_float[2]):
             (src_float[1]>src_float[2]?(int)src_float[1]:(int)src_float[2])) -
            ((src_float[0]<src_float[1])?
             (src_float[0]<src_float[2]?(int)src_float[0]:(int)src_float[2]):
             (src_float[1]<src_float[2]?(int)src_float[1]:(int)src_float[2])));

    /* Optimization: operations by zero */
    snprintf(str, 256, "y=0*sin(x)*200+1.1");
    setup_test('i', 1, 1, src_int, 'f', 1, 1, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: 1.1\n");

    /* Optimization: operations by one */
    snprintf(str, 256, "y=x*1");
    setup_test('i', 1, 1, src_int, 'f', 1, 1, dest_float);
    result += parse_and_eval(EXPECT_SUCCESS);
    eprintf("Expected: 1\n");

    /* Error check: division by zero */
    snprintf(str, 256, "y=x/0");
    setup_test('i', 1, 1, src_int, 'f', 1, 1, dest_float);
    result += parse_and_eval(EXPECT_FAILURE);
    eprintf("Expected: FAILURE\n");

    return result;
}