
/*	fail-float_arith1.mc	*/
int main()
{
	float f;
	f = 1.0;
	print(f + "aaa");
	return 0;
}

/*
Output
	Fatal error: exception Failure("illegal binary operator float + string in f + aaa")

*/

/*	fail-float_arith2.mc	*/
int main()
{
	float f;
	f = 1.0;
	print(f * true);
	return 0;
}

/*
Output
	Fatal error: exception Failure("illegal binary operator float * bool in f * true")

*/

/*	fail-float_arith3.mc	*/
int main()
{
	float f;
	f = 1.0;
	print(f - "bbb");
	return 0;
}

/*
Output
	Fatal error: exception Failure("illegal binary operator float - string in f - bbb")

*/

/*	fail-float_arith4.mc	*/
int main()
{
	float f;
	f = 1.0;
	print(f / false);
	return 0;
}

/*
Output
	Fatal error: exception Failure("illegal binary operator float / bool in f / false")

*/

/*	test-arith1.mc	*/
int main()
{
  print(39 + 3);
  return 0;
}
/*
Output
	42

*/

/*	test-arith2.mc	*/
int main()
{
  print(1 + 2 * 3 + 4);
  return 0;
}
/*
Output
	11

*/

/*	test-arith3.mc	*/
int foo(int a)
{
  return a;
}

int main()
{
  int a;
  a = 42;
  a = a + 5;
  print(a);
  return 0;
}
/*
Output
	47

*/

/*	test-arith_mulAndDiv.mc	*/
int main()
{
  print(2*3);
  print(5/1);
  print(2/3);
  return 0;
}

/*
Output
	6

	5

	0

*/

/*	test-float_arith1.mc	*/
int main()
{
  /* assign string */
  float a;
  float b;
  a = -3.5 + 1.0;
  b = a + 1.0;
  print(b);

  return 0;
}

/*
Output
	-1.500000
*/

/*	test-float_arith2.mc	*/
int main()
{
  /* assign string */
  float a;
  float b;
  a = -3.5 + 1.0;
  b = a + 1.0;
  print(1.0+b*a);

  return 0;
}

/*
Output
	4.750000
*/

/*	test-float_arith3.mc	*/
int main()
{
  /* assign string */
  float a;
  float b;
  a = -3.5 + 1.0;
  b = a + 1.0;
  print(b/a);

  return 0;
}

/*
Output
	0.600000
*/

/*	test-float_arith4.mc	*/
int main()
{
  /* assign string */
  float a;
  float b;
  a = -3.5 + 1.0;
  b = a + 1.0;
  print(b-a);

  return 0;
}

/*
Output
	1.000000
*/

/*	test-float_arith5.mc	*/
int main()
{
  /* assign string */
  float a;
  float b;
  a = -3.5 + 1.0;
  b = 0.0;
  print(a/b);

  return 0;
}
/*
Output
	-inf
*/

/*	test-float_arith_cmp1.mc	*/
int main()
{
  float a;
  float b;
  a = 1.0;
  b = 1.0;
  if (a == b)
	print("correct");
  else
	print("not correct");
  
  return 0;
}
/*
Output
	correct
*/

/*	test-float_arith_cmp2.mc	*/
int main()
{
  float a;
  float b;
  a = 1.0;
  b = 1.2;
  if (a < b)
	print("correct");
  else
	print("not correct");
  
  return 0;
}
/*
Output
	correct
*/

/*	test-float_arith_cmp3.mc	*/
int main()
{
  float a;
  float b;
  a = 1.0;
  b = 1.0;
  if (a <= b)
	print("correct");
  else
	print("not correct");
  
  return 0;
}
/*
Output
	correct
*/

/*	test-float_arith_cmp4.mc	*/
int main()
{
  float a;
  float b;
  a = 2.0;
  b = 1.0;
  if (a > b)
	print("correct");
  else
	print("not correct");
  
  return 0;
}
/*
Output
	correct
*/

/*	test-float_arith_cmp5.mc	*/
int main()
{
  float a;
  float b;
  a = 1.0;
  b = 1.0;
  if (a >= b)
	print("correct");
  else
	print("not correct");
  
  return 0;
}
/*
Output
	correct
*/

/*	test-float_arith_cmp6.mc	*/
int main()
{
  float a;
  float b;
  a = 2.0;
  b = 1.0;
  if (a != b)
	print("correct");
  else
	print("not correct");
  
  return 0;
}
/*
Output
	correct
*/

/*	test-array1.mc	*/
int main() {
  int[] array;
  array = new int[5];
  print(array[0]);
  print(array[4]);
  return 0;
}
/*
Output
	0

	0

*/

/*	test-array2.mc	*/
int main() {
  int[] array;
  array = new int[5];
  array[3] = 88;
  print(array[3]);
  return 0;
}
/*
Output
	88

*/

/*	test-array3.mc	*/
int main()
{
  float[] array;
  array = new float[10];
  array[5] = 3.14;
  print(array[0]);
  print(array[5]);
  return 0;
}
/*
Output
	0.000000

	3.140000

*/

/*	test-array4.mc	*/
int main()
{
  string[] array;
  array = new string[5];
  array[3] = "plt is a nice course";
  print(array[0]);
  print(array[3]);
  return 0;
}
/*
Output
	(null)

	plt is a nice course

*/

/*	fail-assign1.mc	*/
int main()
{
  int i;
  bool b;

  i = 42;
  i = 10;
  b = true;
  b = false;
  i = false; /* Fail: assigning a bool to an integer */
}
/*
Output
	Fatal error: exception Failure("illegal assignment int = bool in $i[int] = false")

*/

/*	fail-assign2.mc	*/
int main()
{
  int i;
  bool b;

  b = 48; /* Fail: assigning an integer to a bool */
}
/*
Output
	Fatal error: exception Failure("illegal assignment bool = int in $b[bool] = 48")

*/

/*	fail-assign3.mc	*/
void myvoid()
{
  return;
}

int main()
{
  int i;

  i = myvoid(); /* Fail: assigning a void to an integer */
}
/*
Output
	Fatal error: exception Failure("illegal assignment int = void in $i[int] = myvoid()[void]")

*/

/*	fail-assign_boolToFloat.mc	*/
int main()
{
  float b;
  b = false;
  return 0;
}

/*
Output
	Fatal error: exception Failure("illegal assignment float = bool in $b[float] = false")

*/

/*	fail-assign_boolToString.mc	*/
int main()
{
  bool b;
  string s;
  b = false;
  s = b; /* assign bool to string */

  return 0;
}

/*
Output
	Fatal error: exception Failure("illegal assignment string = bool in $s[string] = $b[bool]")

*/

/*	fail-assign_FloatToInt.mc	*/
int main()
{
	int a;
	a = 3.5;
	return 0;
}

/*
Output
	Fatal error: exception Failure("illegal assignment int = float in $a[int] = 3.5")

*/

/*	fail-assign_voidToString.mc	*/
void voidFunc(){
  return void;
}


int main()
{
  string s;
  s = voidFunc();
  return 0;
}

/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	test-assign_float1.mc	*/
int main()
{
  /* assign string */
  float a;
  a = 3.5;
  print(a);

  return 0;
}

/*
Output
	3.500000
*/

/*	test-assign_float2.mc	*/
int main()
{
  /* assign string */
  float a;
  float b;
  a = -3.5;
  b = a;
  print(b);

  return 0;
}

/*
Output
	-3.500000
*/

/*	test-assign_string.mc	*/
int main()
{
  /* assign string */
  string s;
  s = "hello";
  print(s);

  return 0;
}

/*
Output
	hello

*/

/*	test-hello.mc	*/
int main()
{
  print(42);
  print(71);
  print(1);
  return 0;
}
/*
Output
	42

	71

	1

*/

/*	test-hello_world.mc	*/
int main()
{
  print("Hello World");
  return 0;
}
/*
Output
	Hello World

*/

/*	test-ops1.mc	*/
int main()
{
  print(1 + 2);
  print(1 - 2);
  print(1 * 2);
  print(100 / 2);
  print(99);
  print(1 == 2);
  print(1 == 1);
  print(99);
  print(1 != 2);
  print(1 != 1);
  print(99);
  print(1 < 2);
  print(2 < 1);
  print(99);
  print(1 <= 2);
  print(1 <= 1);
  print(2 <= 1);
  print(99);
  print(1 > 2);
  print(2 > 1);
  print(99);
  print(1 >= 2);
  print(1 >= 1);
  print(2 >= 1); 
  return 0;
}
/*
Output
	3

	-1

	2

	50

	99

	0

	1

	99

	1

	0

	99

	1

	0

	99

	1

	1

	0

	99

	0

	1

	99

	0

	1

	1

*/

/*	test-ops2.mc	*/
int main()
{
  print(true);
  print(false);
  print(true && true);
  print(true && false);
  print(false && true);
  print(false && false);
  print(true || true);
  print(true || false);
  print(false || true);
  print(false || false);
  print(!false);
  print(!true);
  print(-10);
  print(--42);

  return 0;
}

/*
Output
	1

	0

	1

	0

	0

	0

	1

	1

	1

	0

	1

	0

	-10

	42

*/

/*	fail-cast1.mc	*/
int main()
{
	bool a;
	a = (bool)"a";
	return 0;
}/*
Output
	Fatal error: exception Failure("Covert from string to boolis not permitted")

*/

/*	fail-cast2.mc	*/
class foo
{
	int aaa;
}

int main()
{
	int a;
	foo f;
	f = (foo)a;
	return 0;
}/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	fail-cast3.mc	*/
int main()
{
	if (3 > false)
	{
		print("hello world");
	}
	return 0;
}/*
Output
	Fatal error: exception Failure("illegal binary operator int > bool in 3 > false")

*/

/*	test-cast1.mc	*/
int main()
{
	string a;
	float b;
	string c;
	a = "aaa";
	b = ((int)"1") + 1.7;
	c = "aaa";
	if (b > 2 && (a==c))
	{
		print("variable b is larger than 2 value:" + (string)b);
	}
	else
		print("variable b is not larger than 2 value:" + (string)b);
		
	return 0;
}/*
Output
	variable b is larger than 2 value:2.700000
*/

/*	test-cast2.mc	*/
int main()
{
	int a;
	a = ((int)3.5);
	print(a);
	return 0;
}/*
Output
	3
*/

/*	test-cast3.mc	*/
int main()
{
	int a;
	a = ((int)3.5);
	print((float)a);
	return 0;
}/*
Output
	3.000000
*/

/*	test-cast4.mc	*/
int main()
{
	int a;
	float b;
	b = (float)"3.5";
	a = (int)b;
	print(a);
	return 0;
}/*
Output
	3
*/

/*	test-implicit_conversion1.mc	*/
int main()
{
	float a;
	float b;
	a = 3;
	b = (float)3;
	print(a);
	print(b);
	return 0;
}/*
Output
	3.000000

	3.000000
*/

/*	test-implicit_conversion2.mc	*/
int main()
{
	int a;
	float b;
	a = 3;
	b = 3.5;
	if (a<b)
		print("a is smaller than b");
	else
		print("a is larger than b");
	return 0;
}/*
Output
	a is smaller than b
*/

/*	test-implicit_conversion3.mc	*/
int main()
{
	int a;
	float b;
	a = (int)"10";
	b = (float)"10";
	if (a == b)
	{
		print("a equals to b");
	}
	else
		print("a doesn't equal to b");
	return 0;
}/*
Output
	a equals to b
*/

/*	fail-expr1.mc	*/
int a;
bool b;

void foo(int c, bool d)    
{
  int dd;
  bool e;
  a + c;
  c - a;
  a * 3;
  c / 2;
  d + a; /* Error: bool + int */
}

int main()
{
  return 0;
}
/*
Output
	Fatal error: exception Failure("illegal binary operator bool + int in d + a")

*/

/*	fail-expr2.mc	*/
int a;
bool b;

void foo(int c, bool d)    
{
  int d;
  bool e;
  b + a; /* Error: bool + int */
}

int main()
{
  return 0;
}
/*
Output
	Fatal error: exception Failure("illegal binary operator bool + int in b + a")

*/

/*	test-expr1.mc	*/
int a;
bool b;

void foo(int c, bool d)    
{
  int dd;
  bool e;
  a + c;
  c - a;
  a * 3;
  c / 2;
}

int main()
{
  return 0;
}
/*
Output
*/

/*	fail-for1.mc	*/
int main()
{
  int i;
  for ( ; true ; ) {} /* OK: Forever */

  for (i = 0 ; i < 10 ; i = i + 1) {
    if (i == 3) return 42;
  }

  for (j = 0; i < 10 ; i = i + 1) {} /* j undefined */

  return 0;
}
/*
Output
	Fatal error: exception Analyzer.UndefinedID("j")

*/

/*	fail-for13_varNotInit.mc	*/
int main()
{
  /* Uninitialized var in body */
  int i;
  for(i=0;i<2;i++)
    print(k);

  return 0;
}

/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	fail-for2.mc	*/
int main()
{
  int i;

  for (i = 0; j < 10 ; i = i + 1) {} /* j undefined */

  return 0;
}
/*
Output
	Fatal error: exception Analyzer.UndefinedID("j")

*/

/*	fail-for3.mc	*/
int main()
{
  int i;

  for (i = 0; i ; i = i + 1) {} /* i is an integer, not Boolean */

  return 0;
}
/*
Output
	Fatal error: exception Failure("invaild statement type in For")

*/

/*	fail-for4.mc	*/
int main()
{
  int i;

  for (i = 0; i < 10 ; i = j + 1) {} /* j undefined */

  return 0;
}
/*
Output
	Fatal error: exception Analyzer.UndefinedID("j")

*/

/*	fail-for5.mc	*/
int main()
{
  int i;

  for (i = 0; i < 10 ; i = i + 1) {
    foo(); /* Error: no function foo */
  }

  return 0;
}
/*
Output
	Fatal error: exception Analyzer.UndefinedFunction("foo")

*/

/*	fail-for_noSemicolon.mc	*/
int main()
{
  for(){ /* nothing in () */
    print(0);
  }

  return 0;
}

/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	fail-for_tooFewSemicolon.mc	*/
int main()
{
  for(;){ /* only 1 semi-colon in () */
    print(0);
  }

  return 0;
}

/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	fail-for_tooManySemicolons.mc	*/
int main()
{
  for(;;;){ /* too many semi-colon in () */
    print(0);
  }

  return 0;
}

/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	test-for1.mc	*/
int main()
{
  int i;
  for (i = 0 ; i < 5 ; i = i + 1) {
    print(i);
  }
  print(42);
  return 0;
}
/*
Output
	0

	1

	2

	3

	4

	42

*/

/*	test-for2.mc	*/
int main()
{
  int i;
  i = 0;
  for ( ; i < 5; ) {
    print(i);
    i = i + 1;
  }
  print(42);
  return 0;
}
/*
Output
	0

	1

	2

	3

	4

	42

*/

/*	test-for_modifyOuterVar.mc	*/
int main()
{
  /* init, access and modify in for body */
  int i;
  int k;
  i = 3;
  for(i=0;i<2;i=i+1){
    k = 10 + i;
    print(k);
  }
  print(k);
  return 0;
}

/*
Output
	10

	11

	11

*/

/*	fail-func1.mc	*/
int foo() {}

int bar() {}

int baz() {}

void bar() {} /* Error: duplicate function bar */

int main()
{
  return 0;
}
/*
Output
	Fatal error: exception Failure("duplicated function declaration bar")

*/

/*	fail-func2.mc	*/
int foo(int a, bool b, int c) { }

void bar(int a, bool b, int a) {} /* Error: duplicate formal a in bar */

int main()
{
  return 0;
}
/*
Output
	Fatal error: exception Failure("duplicate formals a")

*/

/*	fail-func3.mc	*/
int foo(int a, bool b, int c) { }

void bar(int a, void b, int c) {} /* Error: illegal void formal b */

int main()
{
  return 0;
}
/*
Output
	Fatal error: exception Failure("formal b shouldn't be type void")

*/

/*	fail-func4.mc	*/
int foo() {}

void bar() {}

int print() {} /* Should not be able to define print */

void baz() {}

int main()
{
  return 0;
}
/*
Output
	Fatal error: exception Failure("duplicated function declaration print")

*/

/*	fail-func5.mc	*/
int foo() {}

int bar() {
  int a;
  void b; /* Error: illegal void local b */
  bool c;

  return 0;
}

int main()
{
  return 0;
}
/*
Output
	Fatal error: exception Failure("local b shouldn't be type void")

*/

/*	fail-func6.mc	*/
void foo(int a, bool b)
{
}

int main()
{
  foo(42, true);
  foo(42); /* Wrong number of arguments */
}
/*
Output
	Fatal error: exception Failure("expecting 2 argument(s) in foo(42)")

*/

/*	fail-func7.mc	*/
void foo(int a, bool b)
{
}

int main()
{
  foo(42, true);
  foo(42, true, false); /* Wrong number of arguments */
}
/*
Output
	Fatal error: exception Failure("expecting 2 argument(s) in foo(42, true, false)")

*/

/*	fail-func8.mc	*/
void foo(int a, bool b)
{
}

void bar()
{
}

int main()
{
  foo(42, true);
  foo(42, bar()); /* int and void, not int and bool */
}
/*
Output
	Fatal error: exception Failure("illegal actual argument found void expected bool in bar()[void]")

*/

/*	fail-func9.mc	*/
void foo(int a, bool b)
{
}

int main()
{
  foo(42, true);
  foo(42, 42); /* Fail: int, not bool */
}
/*
Output
	Fatal error: exception Failure("illegal actual argument found int expected bool in 42")

*/

/*	fail-func_assignInArg.mc	*/
void func(int i = 5){ /* assignment in argument */
  print(i);
}
int main()
{
  func(3);
  return 0;
}

/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	fail-func_needStringGivenInt.mc	*/
void func(string s){
  prints("Got string");
}
int main()
{
  func(1); /* need string but given int */
  return 0;
}

/*
Output
	Fatal error: exception Failure("illegal actual argument found int expected string in 1")

*/

/*	test-add1.mc	*/
int add(int x, int y)
{
  return x + y;
}

int main()
{
  print( add(17, 25) );
  return 0;
}
/*
Output
	42

*/

/*	test-func1.mc	*/
int add(int a, int b)
{
  return a + b;
}

int main()
{
  int a;
  a = add(39, 3);
  print(a);
  return 0;
}
/*
Output
	42

*/

/*	test-func2.mc	*/
/* Bug noticed by Pin-Chin Huang */

int fun(int x, int y)
{
  return 0;
}

int main()
{
  int i;
  i = 1;

  fun(i = 2, i = i+1);

  print(i);
  return 0;
}

/*
Output
	2

*/

/*	test-func3.mc	*/
void printem(int a, int b, int c, int d)
{
  print(a);
  print(b);
  print(c);
  print(d);
}

int main()
{
  printem(42,17,192,8);
  return 0;
}
/*
Output
	42

	17

	192

	8

*/

/*	test-func4.mc	*/
int add(int a, int b)
{
  int c;
  c = a + b;
  return c;
}

int main()
{
  int d;
  d = add(52, 10);
  print(d);
  return 0;
}
/*
Output
	62

*/

/*	test-func5.mc	*/
int foo(int a)
{
  return a;
}

int main()
{
  return 0;
}
/*
Output
*/

/*	test-func6.mc	*/
void foo() {}

int bar(int a, bool b, int c) { return a + c; }

int main()
{
  print(bar(17, false, 25));
  return 0;
}
/*
Output
	42

*/

/*	test-func7.mc	*/
int a;

void foo(int c)
{
  a = c + 42;
}

int main()
{
  foo(73);
  print(a);
  return 0;
}
/*
Output
	115

*/

/*	test-func8.mc	*/
void foo(int a)
{
  print(a + 3);
}

int main()
{
  foo(40);
  return 0;
}
/*
Output
	43

*/

/*	test-func_noArgFunc.mc	*/
void noArg(){
  print(0);
}

int main()
{
  /* function with no arg */
  noArg();
  return 0;
}

/*
Output
	0

*/

/*	test-func_stringArg.mc	*/
void printString(string s){
  print(s);
}
int main()
{
  printString("Hi");
  return 0;
}

/*
Output
	Hi

*/

/*	test-func_touchGlobalVar.mc	*/
int a;

void printGlobal(){
  print(a);
  a = 4;
  print(a);
}
int main()
{
  /* init, access and modify global var */
  a = 3;
  printGlobal();
  a = 5;
  print(a);
  return 0;
}

/*
Output
	3

	4

	5

*/

/*	fail-global1.mc	*/
int c;
bool b;
void a; /* global variables should not be void */


int main()
{
  return 0;
}
/*
Output
	Fatal error: exception Failure("global a shouldn't be void type")

*/

/*	fail-global2.mc	*/
int b;
bool c;
int a;
int b; /* Duplicate global variable */

int main()
{
  return 0;
}
/*
Output
	Fatal error: exception Failure("duplicated global declaration b")

*/

/*	test-global1.mc	*/
int a;
int b;

void printa()
{
  print(a);
}

void incab()
{
  a = a + 1;
  b = b + 1;
}

int main()
{
  a = 42;
  b = 21;
  printa();
  incab();
  printa();
  return 0;
}
/*
Output
	42

	43

*/

/*	test-global2.mc	*/
bool i;

int main()
{
  int i; /* Should hide the global i */

  i = 42;
  print(i + i);
  return 0;
}
/*
Output
	84

*/

/*	test-global3.mc	*/
int i;
bool b;
int j;

int main()
{
  i = 42;
  j = 10;
  print(i + j);
  return 0;
}
/*
Output
	52

*/

/*	test-var2.mc	*/
int a;

void foo(int c)
{
  a = c + 42;
}

int main()
{
  foo(73);
  print(a);
  return 0;
}
/*
Output
	115

*/

/*	fail-if1.mc	*/
int main()
{
  if (true) {}
  if (false) {} else {}
  if (42) {} /* Error: non-bool predicate */
}
/*
Output
	Fatal error: exception Failure("expected Boolean expression in 42")

*/

/*	fail-if11.mc	*/
int main()
{
  if(true){
    else{
      print(0); /* dangling else */
    }
  }

  return 0;
}

/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	fail-if12.mc	*/
int main()
{
  if(true)
    else /* dangling else, no semicolon */
      print(0);

  return 0;
}

/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	fail-if2.mc	*/
int main()
{
  if (true) {
    foo; /* Error: undeclared variable */
  }
}
/*
Output
	Fatal error: exception Analyzer.UndefinedID("foo")

*/

/*	fail-if3.mc	*/
int main()
{
  if (true) {
    42;
  } else {
    bar; /* Error: undeclared variable */
  }
}
/*
Output
	Fatal error: exception Analyzer.UndefinedID("bar")

*/

/*	test-if1.mc	*/
int main()
{
  if (true) print(42);
  print(17);
  return 0;
}
/*
Output
	42

	17

*/

/*	test-if2.mc	*/
int main()
{
  if (true) print(42); else print(8);
  print(17);
  return 0;
}
/*
Output
	42

	17

*/

/*	test-if3.mc	*/
int main()
{
  if (false) print(42);
  print(17);
  return 0;
}
/*
Output
	17

*/

/*	test-if4.mc	*/
int main()
{
  if (false) print(42); else print(8);
  print(17);
  return 0;
}
/*
Output
	8

	17

*/

/*	test-if5.mc	*/
int cond(bool b)
{
  int x;
  if (b)
    x = 42;
  else
    x = 17;
  return x;
}

int main()
{
 print(cond(true));
 print(cond(false));
 return 0;
}
/*
Output
	42

	17

*/

/*	test-if_nestedIf.mc	*/
int main()
{
  /* nested if */
  bool outer;
  bool inner;
  outer = true;
  inner = true;

  if(outer){
    if(inner){
      print(0);
    }else{
      print(1);
    }
  }

  return 0;
}

/*
Output
	0

*/

/*	fail-nomain.mc	*/
/*
Output
	Fatal error: exception Analyzer.MainNotDefined

*/

/*	test-fib.mc	*/
int fib(int x)
{
  if (x < 2) return 1;
  return fib(x-1) + fib(x-2);
}

int main()
{
  print(fib(0));
  print(fib(1));
  print(fib(2));
  print(fib(3));
  print(fib(4));
  print(fib(5));
  return 0;
}
/*
Output
	1

	1

	2

	3

	5

	8

*/

/*	test-gcd.mc	*/
int gcd(int a, int b) {
  while (a != b) {
    if (a > b) a = a - b;
    else b = b - a;
  }
  return a;
}

int main()
{
  print(gcd(2,14));
  print(gcd(3,15));
  print(gcd(99,121));
  return 0;
}
/*
Output
	2

	3

	11

*/

/*	test-gcd2.mc	*/
int gcd(int a, int b) {
  while (a != b)
    if (a > b) a = a - b;
    else b = b - a;
  return a;
}

int main()
{
  print(gcd(14,21));
  print(gcd(8,36));
  print(gcd(99,121));
  return 0;
}
/*
Output
	7

	4

	11

*/

/*	test-local1.mc	*/
void foo(bool i)
{
  int i; /* Should hide the formal i */

  i = 42;
  print(i);
}

int main()
{
  foo(true);
  return 0;
}
/*
Output
	42

*/

/*	test-local2.mc	*/
int foo(int a, bool b)
{
  int c;
  bool d;

  c = a;

  return c + 10;
}

int main() {
 print(foo(37, false));
 return 0;
}
/*
Output
	47

*/

/*	test-local_localShadowArg.mc	*/
void printLocal(int a){
  int a;
  a = 6;
  print(a);
}

int main(){
  /* inner scope shadows outer scope var */
  int a;
  a = 5;
  printLocal(a);
  print(a);
  return 0;
}
/*
Output
	6

	5

*/

/*	test-var1.mc	*/
int main()
{
  int a;
  a = 42;
  print(a);
  return 0;
}
/*
Output
	42

*/

/*	test-class_func.mc	*/
class Test{
    constructor(){}
    int getInt(){
        return 3;
    }
}
int main(){
    class Test t;
    int i;
    t = new Test();
    i = t.getInt();
    print(i);

    return 0;
}/*
Output
	3
*/

/*	test-class_funcWithThis.mc	*/
class Line {
    int x;
	constructor(int a){
        x = a;
    }
    int getX() {
      int a;
      a = this.x;     
      return a;
    }
}


int main() {
    class Line e;
    int i;
    e = new Line(5);
	i = e.getX();
    print(i);
    return 0;
}
/*
Output
	5
*/

/*	test-class_inClassFor.mc	*/
class Test{
    int value;
    constructor(int v){
        value = v;
    }
    int getValue(){
        int v;
        int i;

        v = this.value;
        for(i=0;i<3;i = i+1){
            v = v*2;
        }

        return v;
    }
}
int main(){
    class Test t1;
    class Test t2;
    int v1;
    int v2;
    
    t1 = new Test(3);
    t2 = new Test(-1);
    v1 = t1.getValue();
    v2 = t2.getValue();

    print(v1);
    print(v2);

    return 0;
}/*
Output
	24

	-8
*/

/*	test-class_inClassIf.mc	*/
class Test{
    int value;
    constructor(int v){
        value = v;
    }
    int getValue(){
        int v;

        v = this.value;
        if(v < 3)
            v = v*2;
        return v;
    }
}
int main(){
    class Test t1;
    class Test t2;
    int v1;
    int v2;

    t1 = new Test(1);
    t2 = new Test(3);
    v1 = t1.getValue();
    v2 = t2.getValue();

    print(v1);
    print(v2);

    return 0;
}/*
Output
	2

	3
*/

/*	test-class_inClassWhile.mc	*/
class Test{
    int value;
    constructor(int v){
        value = v;
    }
    int getValue(){
        int v;

        v = this.value;
        while(v>10){
            v = v/2;
        }

        return v;
    }
}
int main(){
    class Test t1;
    class Test t2;
    int v1;
    int v2;

    t1 = new Test(100);
    t2 = new Test(9);
    v1 = t1.getValue();
    v2 = t2.getValue();

    print(v1);
    print(v2);

    return 0;
}/*
Output
	6

	9
*/

/*	test-class_nestedAccess.mc	*/
class A{
  int x;
  constructor(int the_x){
    x = the_x;
  }
}
class B{
  class A a;
  constructor(class A the_a){
    a = the_a;
  }
}

int main(){
  int c;
  class A a;
  class B b;
  a = new A(3);
  b = new B(a);
  c = b.a.x;
  print(c);
  return 0;
}
/*
Output
	3

*/

/*	test-class_nestedObj.mc	*/
class Dot{
  int x;
  int y;
  constructor(int a, int b){
    x = a;
    y = b;
  }
}
class Circle{
  class Dot center;
  constructor(class Dot d){
    center = d;
  }
}

int main(){
  class Dot d;
  class Circle c;
  d = new Dot(3,5);
  c = new Circle(d);
  print(c.center.x);
  print(c.center.y);
  return 0;
}
/*
Output
	3

	5

*/

/*	test-class_noParamConstructor.mc	*/
class Circle{
  int x;
  int y;
  constructor(){}
}
int main(){
  class Circle c;
  c = new Circle();
  return 0;
}
/*
Output
*/

/*	test-class_objArrayField.mc	*/
class Test{
    int[] array;
    constructor(){
        array = new int[10];
    }
}

int main(){
    class Test t;
    int[] a;
    t = new Test();
    a = t.array;
    a[3] = 33;
    print(a[0]);
    print(a[3]);
    print(a[9]);
    return 0;
}/*
Output
	0

	33

	0
*/

/*	test-class_objAsParam.mc	*/
class Line {
	constructor(){}
}


int foo(class Line e) {
	return 0;
}

int main() {
    class Line e;
    e = new Line();
	print(foo(e));	
    return 0;
}/*
Output
	0
*/

/*	test-class_printObjAccess.mc	*/
class Circle{
  int x;
  int y;
  constructor(int a, int b){
    x = a;
    y = b;
  }
}
int main(){
  class Circle c;
  c = new Circle(3,5);
  print(c.x);
  return 0;
}
/*
Output
	3

*/

/*	test-class_recursion.mc	*/
class Node{
    int value;
    string s;
    class Node left;
    class Node right;
    
    constructor(int v, string ss){
        value = v;
        s = ss;
    }
    constructor(class Node l, class Node r, int v, string ss){
        value = v;
        left = l;
        right = r;
        s = ss;
    }

    string getValue(){
        string ss;
        string lVal;
        string rVal;
        int v;
        string sss;

        v = this.value;
        if(v == 0){
            sss = this.s;
            return sss;
        }

        lVal = this.left.getValue();
        rVal = this.right.getValue();
        sss = this.s;
        ss = "" + lVal +  "<-" + sss + "->" + rVal;

        return ss;
    }
}
int main(){
    class Node root;
    class Node left;
    class Node right;
    string s;

    left = new Node((int)(float)"0.0","foo");
    right = new Node(0,"bar");
    root = new Node(left, right, 4, "foobar");
    s = root.getValue();
    print(s);

    return 0;
}/*
Output
	foo<-foobar->bar
*/

/*	test-class_stringField.mc	*/
class Circle{
  string s;
  constructor(string t){
    s = t;
  }
}
int main(){
  class Circle c;
  string a;
  c = new Circle("hello");
  a = c.s;
  print(a);
  return 0;
}
/*
Output
	hello

*/

/*	test-class_stringFunc.mc	*/
class Test{
    constructor(){}
    string getString(){
        return "Hello";
    }
}
int main(){
    class Test t;
    string s;
    t = new Test();
    s = t.getString();
    print(s);

    return 0;
}/*
Output
	Hello
*/

/*	test-class_withParamsConstructor.mc	*/
class Circle{
  int x;
  int y;
  constructor(){}
  constructor(int a, int b){
    x=a;
    y=b;
  }
}
int main(){
  class Circle c;
  int the_x;
  c = new Circle(3,5);
  the_x=c.x;
  print(the_x);
  return 0;
}
/*
Output
	3

*/

/*	fail-return1.mc	*/
int main()
{
  return true; /* Should return int */
}
/*
Output
	Fatal error: exception Failure("return gives bool expected int in true")

*/

/*	fail-return2.mc	*/
void foo()
{
  if (true) return 42; /* Should return void */
  else return;
}

int main()
{
  return 42;
}
/*
Output
	Fatal error: exception Failure("return gives int expected void in 42")

*/

/*	test-return_inWhileIf.mc	*/
int main(){
  int i;
  i = 0;
  while(i<3){
    if(i > 2)
      return 0;
    i = i + 1;
    print(i);
  }
  return 0;
}
/*
Output
	1

	2

	3

*/

/*	test-return_returnInWhile.mc	*/
int main(){
  /* return in while */
  int i;
  i = 10;
  while(i<11){
    print("Now return");
    return 0;
  }
  print(3);
  return 1;
}
/*
Output
	Now return

*/

/*	fail-stringaddint.mc	*/
int main()
{
	string a;
	a = "foo";
	print(a + 3);
}



/*
Output
	Fatal error: exception Failure("illegal binary operator string + int in a + 3")

*/

/*	fail-stringequaltoint.mc	*/
int main()
{
	string a;
	a = "foo";
	if (a == 0)
	{
		print(a + 3);
	}
}



/*
Output
	Fatal error: exception Failure("illegal binary operator string == int in a == 0")

*/

/*	fail-stringneqtoint.mc	*/
int main()
{
	string a;
	a = "foo";
	if (a != 0)
	{
		print(a + 3);
	}
}



/*
Output
	Fatal error: exception Failure("illegal binary operator string != int in a != 0")

*/

/*	test-string1.mc	*/
int main()
{
	string a;
	a = "foobar";
	print(a);
	print("foobar");
	return 0;
}
/*
Output
	foobar

	foobar
*/

/*	test-string2.mc	*/
int main()
{
	string a;
	a = "foobar";
	print(a + "foobar");
	return 0;
}
/*
Output
	foobarfoobar
*/

/*	test-string3.mc	*/
int main()
{
	string a;
	string b;
	a = "foo";
	b = "bar";
	print(a + b + "foobar");
	return 0;
}
/*
Output
	foobarfoobar
*/

/*	test-stringequal1.mc	*/
int main()
{
	string a;
	string b;
	a = "aaa";
	b = "aaa";
	if (a == b)
	{
		print("equal");
	}
	else
	{
		print("not equal");
	}
	return 0;
}
/*
Output
	equal
*/

/*	test-stringequal2.mc	*/
int main()
{
	string a;
	string b;
	a = "aaa";
	b = "bbb";
	if (a == b)
	{
		print("equal");
	}
	else
	{
		print("not equal");
	}
	return 0;
}
/*
Output
	not equal
*/

/*	test-stringequal3.mc	*/
int main()
{
	string a;
	string b;
	a = "aaa";
	b = "bbb";
	if (a != b)
	{
		print("not equal");
	}
	else
	{
		print("equal");
	}
	return 0;
}
/*
Output
	not equal
*/

/*	test-tostring1.mc	*/
int main()
{
	int a;
	a = 3;
	print(toString(a));
	return 0;
}
/*
Output
	3
*/

/*	test-tostring2.mc	*/
int main()
{
	float a;
	a = 3.5;
	print("output" + toString(a));
	return 0;
}
/*
Output
	output3.500000
*/

/*	test-tostring3.mc	*/
int main()
{
	bool a;
	a = false;
	print(toString(a));
	return 0;
}
	/*
Output
	0
*/

/*	test-tostring4.mc	*/
int main()
{
	string a;
	a = "foo ";
	print(toString(a)+toString(3)+" "+ toString(3.5)+ "bar" );
	return 0;
}
/*
Output
	foo 3 3.500000bar
*/

/*	fail-while1.mc	*/
int main()
{
  int i;

  while (true) {
    i = i + 1;
  }

  while (42) { /* Should be boolean */
    i = i + 1;
  }

}
/*
Output
	Fatal error: exception Failure("invaild statement type in While")

*/

/*	fail-while11.mc	*/
int main()
{
  while() /* Nothing in () */
    ;
  return 0;
}

/*
Output
	Fatal error: exception Parsing.Parse_error

*/

/*	fail-while2.mc	*/
int main()
{
  int i;

  while (true) {
    i = i + 1;
  }

  while (true) {
    foo(); /* foo undefined */
  }

}
/*
Output
	Fatal error: exception Analyzer.UndefinedFunction("foo")

*/

/*	test-while1.mc	*/
int main()
{
  int i;
  i = 5;
  while (i > 0) {
    print(i);
    i = i - 1;
  }
  print(42);
  return 0;
}
/*
Output
	5

	4

	3

	2

	1

	42

*/

/*	test-while2.mc	*/
int foo(int a)
{
  int j;
  j = 0;
  while (a > 0) {
    j = j + 2;
    a = a - 1;
  }
  return j;
}

int main()
{
  print(foo(7));
  return 0;
}
/*
Output
	14

*/

Positive tests: 95 passed
Negative tests: 52 passed