![]() |
![]() |
|
Complete the following tests for X2.html,
adding to the test cases already
in the provided X0.
They should be complete, running tests (even though they may not pass yet,
and
Since you need to do X1 in both racket and Java, you need X1 tests for both languages (#1,#2).
However, for X2,
you only need test cases for the language you are using for X2 (#3a or #3b).
Attach two files:
the racket tests in one file,
and the Java tests in another.
(You can add these to the existing test files distributed with X0.)
You don't need to include the further files needed to actually run
(even though you should be able to actually run these files, of course).
When filling in the blanks below,
the result of
solution (available after class on Wed.).
(require rackunit) (define prog0 "~8.1 mod [3]!") (check-equal? (string->expr prog0) ) (check-equal? (expr->string (string->expr prog0)) ) (check-equal? (eval (string->expr prog0)) ) ; Now, make a test for a IfPos expression. ; You only need one example for this submission, but ; in your real program you'll probably want at least three. |
You might add the following to the file ExprTest.java.
@Test void testAFew() { String prog0 = "~8.1 mod [3]!"; assertEquals( Expr.parse(prog0), new BinOp( ) ); assertEquals( Expr.parse(prog0).toString(), ); assertEquals( Expr.parse(prog0).eval(), ); // Now, make a test for a `ifPos` expression. // You only need one example for this submission, but // in your real program you'll probably want at least two or three. } |
If you are using JUnit (see how to run JUnit), these tests should work directly. Otherwise, you might want to write your own method
void assertEquals( Object actual, Object expected ) { if (!actual.equals(expected)) { System.err.printf("assertion failed:\nExpect: %s\nActual: %s\n", expected.toString(), actual.toString() ); } } |
(define prog2 "let x <- 5 in ~4 mlt x!") ; (check-equal? (string->expr prog2) ) (check-equal? (expr->string (string->expr prog2)) ) (check-equal? (eval (string->expr prog2)) ) ; Make an additional example, where the `let` is *not* the top-level expression: ; Then, have the three tests for it, as above. ; For X2, the item B.iv mentions that you'll have to do substitution in a tree. ; Although `substitute` returns a *tree* (an Expr), ; we can use `string->expr` (already tested!) to help us generate our expected-results. ; (check-equal? (substitute "x" 9 (string->expr "3")) (string->expr ) ) (check-equal? (substitute "x" 9 (string->expr "x")) (string->expr ) ) (check-equal? (substitute "z" 7 (string->expr "x")) (string->expr ) ) (check-equal? (substitute "z" 7 (string->expr "~4 sub z!")) (string->expr ) ) (check-equal? (substitute "z" 7 (string->expr "let x <- z in ~x mod z!")) (string->expr ) ) ; Give at least one more interesting tree, to test `substitute` on, ; with parse-tree of height of 2 or more. ; You do *not* need to do `substitute` on a parse tree containing a `let` inside of it ... yet. ; (But you are encouraged to start thinking about what you want to happen, in that situation.) |
String prog2 = "let x <- 5 in ~4 mlt x!"; assertEquals( Expr.parse(prog2), ); assertEquals( Expr.parse(prog2).toString(), ); assertEquals( Expr.parse(prog2).eval(), ); /* ; Make an example, where the `let` is *not* the top-level expression: ; Then, have the three tests for it, as above. */ /* ; For X2, item B.iv mentions that you'll have to do substitution in a tree. ; Although `substitute` returns a *tree* (an Expr), ; we can use `parse` (already tested!) to help us generate our expected-results. */ assertEquals( Expr.parse("3").substitute(new Id("x"),new Num(9)), Expr.parse( ) ); assertEquals( Expr.parse("x").substitute(new Id("x"),new Num(9)), Expr.parse( ) ); assertEquals( Expr.parse("x").substitute(new Id("z"),new Num(7)), Expr.parse( ) ); assertEquals( Expr.parse("~4 sub z!").substitute(new Id("z"),new Num(7)), Expr.parse( ) ); assertEquals( Expr.parse("let x <- z in ~x mlt z!").substitute(new Id("z"),new Num(7)), Expr.parse( ) ); /* ; Give at least one more interesting tree, to test `substitute` on, ; with parse-tree of height 2 or more. ; You do *not* need to do `substitute` on a parse tree containing a `let` inside of it ... yet. ; (But you are encouraged to start thinking about what you want to happen, in that situation.) */ |
This code should compile and run,
though of course they won't yet pass.
Note that before these tests compile/run,
you'll need to define the structs/classes for
These tests are not meant to be comprehensive of everything you'll eventually want to test for. They are just intended to get you started on the homework, and understanding what the functions need to do, before the weekend.
This page licensed CC-BY 4.0 Ian Barland Page last generated | Please mail any suggestions (incl. typos, broken links) to ibarland ![]() |