@Test
 public void CallInterfaceWithMultipleReturn() throws Exception {
   ArdenValue val =
       eval(
           "x := INTERFACE {ytest}",
           "(data1, data2, data3) := CALL x WITH 1,(2,3),4; conclude true;",
           "return (COUNT data1, data2, data3);",
           new TestContext() {
             @Override
             public ArdenRunnable findInterface(String mapping) {
               Assert.assertEquals("ytest", mapping);
               return new ArdenRunnable() {
                 @Override
                 public ArdenValue[] run(ExecutionContext context, ArdenValue[] arguments)
                     throws InvocationTargetException {
                   Assert.assertEquals(3, arguments.length);
                   Assert.assertEquals("1", arguments[0].toString());
                   Assert.assertEquals("(2,3)", arguments[1].toString());
                   Assert.assertEquals("4", arguments[2].toString());
                   return new ArdenValue[] {ArdenList.EMPTY, new ArdenString("hello")};
                 }
               };
             }
           });
   Assert.assertEquals("(0,\"hello\",null)", val.toString());
 }
 @Test
 public void CallInterface() throws Exception {
   ArdenValue val =
       eval(
           "x := INTERFACE {ytest}",
           "data1 := CALL x WITH 1,(2,3),4; conclude true;",
           "return data1;",
           new TestContext() {
             @Override
             public ArdenRunnable findInterface(String mapping) {
               Assert.assertEquals("ytest", mapping);
               return new ArdenRunnable() {
                 @Override
                 public ArdenValue[] run(ExecutionContext context, ArdenValue[] arguments)
                     throws InvocationTargetException {
                   Assert.assertEquals(3, arguments.length);
                   Assert.assertEquals("1", arguments[0].toString());
                   Assert.assertEquals("(2,3)", arguments[1].toString());
                   Assert.assertEquals("4", arguments[2].toString());
                   return new ArdenValue[] {ArdenNumber.create(42, 0)};
                 }
               };
             }
           });
   Assert.assertEquals("42", val.toString());
 }
 @Test
 public void CallMlmWithMultipleReturn() throws Exception {
   ArdenValue val =
       eval(
           "x := MLM 'ytest' FROM INSTITUTION \"abc\"",
           "(data1, data2, data3) := CALL x WITH 1,(2,3),4; conclude true;",
           "return (COUNT data1, data2, data3);",
           new TestContext() {
             @Override
             public ArdenRunnable findModule(String name, String institution) {
               Assert.assertEquals("ytest", name);
               Assert.assertEquals("abc", institution);
               return new ArdenRunnable() {
                 @Override
                 public ArdenValue[] run(ExecutionContext context, ArdenValue[] arguments)
                     throws InvocationTargetException {
                   Assert.assertEquals(3, arguments.length);
                   Assert.assertEquals("1", arguments[0].toString());
                   Assert.assertEquals("(2,3)", arguments[1].toString());
                   Assert.assertEquals("4", arguments[2].toString());
                   return new ArdenValue[] {ArdenList.EMPTY, new ArdenString("hello")};
                 }
               };
             }
           });
   Assert.assertEquals("(0,\"hello\",null)", val.toString());
 }
 @Test
 public void CallMlm() throws Exception {
   ArdenValue val =
       eval(
           "x := MLM 'xtest'",
           "data1 := CALL x WITH 1,(2,3),4; conclude true;",
           "return data1;",
           new TestContext() {
             @Override
             public ArdenRunnable findModule(String name, String institution) {
               Assert.assertEquals("xtest", name);
               Assert.assertNull(institution);
               return new ArdenRunnable() {
                 @Override
                 public ArdenValue[] run(ExecutionContext context, ArdenValue[] arguments)
                     throws InvocationTargetException {
                   Assert.assertEquals(3, arguments.length);
                   Assert.assertEquals("1", arguments[0].toString());
                   Assert.assertEquals("(2,3)", arguments[1].toString());
                   Assert.assertEquals("4", arguments[2].toString());
                   return new ArdenValue[] {ArdenNumber.create(42, 0)};
                 }
               };
             }
           });
   Assert.assertEquals("42", val.toString());
 }
 @Test
 public void UninitializedVar() throws Exception {
   ArdenValue sum =
       eval(
           "",
           "if false then isum := 0; endif; conclude true;",
           "return isum;",
           new TestContext());
   Assert.assertEquals("null", sum.toString());
 }
 @Test
 public void IsObjectType() throws Exception {
   ArdenValue val =
       eval(
           "MedicationDose := OBJECT [ Medication, Dose, Status ];",
           "dose := NEW MedicationDose WITH 1,2,3; conclude true;",
           "return (dose IS MedicationDose, 1 IS MedicationDose);",
           new TestContext());
   Assert.assertEquals("(true,false)", val.toString());
 }
 @Test
 public void ExtractAttributeNames() throws Exception {
   ArdenValue val =
       eval(
           "MedicationDose := OBJECT [ Medication, Dose, Status ];",
           "dose := NEW MedicationDose; conclude true;",
           "return EXTRACT ATTRIBUTE NAMES dose;",
           new TestContext());
   Assert.assertEquals("(\"Medication\",\"Dose\",\"Status\")", val.toString());
 }
 @Test
 public void GetWidthAttribute() throws Exception {
   ArdenValue val =
       eval(
           "Rectangle := Object [ aLeft, aTop, aWidth, aHeight ];",
           "rect := NEW Rectangle WITH 1,2,3,4; " + " conclude true;",
           "return rect.awidth;",
           new TestContext());
   Assert.assertEquals("3", val.toString());
 }
 @Test
 public void AttributeFrom() throws Exception {
   ArdenValue val =
       eval(
           "MedicationDose := OBJECT [ Medication, Dose, Status ];",
           "dose := NEW MedicationDose WITH 1,2,3;"
               + "attrNames := (\"Medication\",\"Status\",\"Dose\"); conclude true;",
           "return ATTRIBUTE attrNames FROM dose;",
           new TestContext());
   Assert.assertEquals("(1,3,2)", val.toString());
 }
 @Test
 public void ForLoop() throws Exception {
   ArdenValue sum =
       eval(
           "",
           "isum := 0;\n"
               + "for i in 1 seqto 100 do\n"
               + "   isum := isum + i;\n"
               + "enddo; conclude true;",
           "return isum;",
           new TestContext());
   Assert.assertEquals("5050", sum.toString());
 }
 @Test
 public void WhileLoop() throws Exception {
   ArdenValue sum =
       eval(
           "",
           "i := 0; isum := 0;\n"
               + "while i <= 100 do\n"
               + "   isum := isum + i; i := i + 1;\n"
               + "enddo; conclude true;",
           "return isum;",
           new TestContext());
   Assert.assertEquals("5050", sum.toString());
 }