CSE 6341 programming projects - simple test cases

In addition to these simple test cases, it is your responsibility to write many test cases yourself, and test your implementation with them

Project 1

Test case

int x; int y; x = 3; y = 7;

/* should print the value of y */

print y / x * x + y % x ;

Save in file t.sc; run ./simplec t.sc > t.c and examine t.c: this C program should look something like

#include <stdio.h>

void main(void) {

  int x;

  int y;

  (x=3);

  (y=7);

  printf("%d\n",(((y/x)*x)+(y%x)));

}

Then run gcc -o t t.c; ./t and observe the value 7 being printed. Use a similar process to run the other test cases listed below.

Test case

int x_11; int y__; x_11 = 1; y__ = 2; print x_11 + y__;

The produced C program, when compiled and executed, should print 3

Test case:

int x; int y; x = 11; y = 22;

if (x - y) { x = x * 3; { print x + y; } } else {y = y - 1; print y - x; }

The produced C program, when compiled and executed, should print 55

Test case:

int x; int y = 2 + 3; x = 0; print x + y;

The produced C program, when compiled and executed, should print 5

Test case:

int x; x = 123xyz;

Should fail with a parser error. The Unix process exit code should be the same as EXIT_PARSING_ERROR in interpreter.Interpreter (i.e., the integer value 1). To check this process code, do echo $? from the Unix command line after the interpreter exits with an error message. 

Test case:

int x = 1; int y = 2; x+3 = y;

Should fail with a parser error; Unix process exit code 1

Test case:

int x; x = 01; 

Should fail with a parser error; Unix process exit code 1


Project 2

Test case

int x; int y; int z; x = 8; y = 2; z = (x+8)*y; print z + 1;

Save in a file t.sc. Run with ./simplec t.sc. Should print 33.

Test case

int x; int y; int z; read x; ; z=y=x+1; print z+y;

Create a file t.sc with this code. Create a file t.data with the value -17. Running ./simplec t.sc < t.data should print -32

Test case

Use the same t.sc. Create a file t.bad containing only the string xyz. Running ./simplec t.sc < t.bad should exit with an error message, e.g., ERROR: Could not read x from stdin (or something similar, depending on how your implemented error messages). The Unix process exit code should be the same as EXIT_FAILED_STDIN_READ (i.e., the integer value 4). To check this process code, do echo $? from the Unix command line after the interpreter exits with an error message.

Test case

int x; int y = 7; x = 3; print y / x * x + y % x ;

Should print 7

Test case:

int x; int y; x = 11; y = 22;

if (x - y) { x = x * 3; { print x + y; } } else {y = y - 1; print y - x; }

Should print 55

Test case:

int x = 1-1; int y; y = 7; print y / x * x + y % x ;

Should exit with an error message, e.g., ERROR: Second operand of / is 0. Unix process exit code should be 3 (i.e., EXIT_DIV_BY_ZERO_ERROR)

Test case:

int x; print x;

Should exit with an error message, e.g., ERROR: Read of uninitialized x. Unix process exit code should be 2 (i.e., EXIT_UNINITIALIZED_VAR_ERROR)

Test case:

int x = 8; int y; y = (x = x+1) + x; print y;

Should print 18


Project 3

Test case:

print (1<2) + (1<=2) + (2>1) + (2>=1) + (2==2) + (1!=2);

Should print 6

Test case:

print 1 < 2 + 3;

Should print 1

Test case:

print -(1<2) + (-1<=2) + (2>1) + (2>=1) + (-2==-2) + (1!=2);

Should print 4

Test case:

print ! ( 10 < 20 ) == 10 >= 20;

Should print 1

Test case:

int x = 1; print x <= 1 && x+1 <= 2;

Should print 1

Test case:

int x; print 0 || 5 || x;

Should print 1

Test case:

int x = 0; while (x < 3) { print x; x = x+1; }

Should print  0, 1, 2 (no commas, each on a separate line)


Project 4

Test case

int main() { int x; int y; int z; x = 8; y = 2; z = (x+8)*y; print z + 1; return z; }

Should print 33.

Test case

int f() { int x = 1; return x+1; }

int main() { int x; int y; int z; x = 8; y = 2; z = (x+8)*y; print z + 1 - f(); return z; }

Should print 31

Test case

int f() { int x = 1; return x+1; }

int main() { int x; int y; int z; x = 8; y = 2; z = (x+8)*y; print z + 1 - f() - f(); return z; }

Should print 29

Test case

int f(int x) { int y = x+1; return y-1; }

int main() { int x = 1; int y = 11; print f(y) + f(x+1); return 0; }

Should print 13

Test case

int f() { int x = 1; return x+1; }

int main() { return g(); }

Should exit with an error message about function g not found; Unix process exit code should be 5

Test case

int f() { int x = 1; return x+1; }

int main() { return f(1); }

Should exit with an error message about type error in the call to f; Unix process exit code should be 6

Test case

int f(int x) { int y = x+1; }

int main() { return f(1); }

Should exit with an error message about missing return from f; Unix process exit code should be 7


Project 5

Test case

int f(int x) { int y; if (x==1) return 0; y = x+1; return y+2; }

int main() { print f(1); return 8; }

Should print 0

Test case

int f(int x) { int y; if (x==1) return 0; y = x+1; return y+2; }

int main() { print f(2); return 8; }

Should print 5

Test case

int f(int x) { int y; { if (x==1) return 0; y = x+1; } return y+2; }

int main() { print f(1); return 8; }

Should print 0

Test case

int f(int x) { int y; { if (x==1) return 0; y = x+1; } return y+2; }

int main() { print f(2); return 8; }

Should print 5

Test case

int f(int x) { int y = 0; while (y < 3) { if (x==y) return x; y = y+1; } return -1; }

int main() { print f(-1); print f(0); print f(1); print f(2); print f(3); }

Should print -1, 0, 1, 2, -1 (no commas, each on a separate line)

Test case

int f(int x) { if (x==1) return 1; return x*f(x-1); }

int main() { print f(5); }

Should print 120

Test case

int f(int x) { if (x==1) return 1; return x*g(x-1); }

int g(int x) { if (x==1) return 1; return x*f(x-1); }

int main() { print f(6); }

Should print 720