public void testPredicateConstructor(){
        try{
            try{
                StringReader sr = new StringReader("");
                Lex lex = new Lex(sr);
                ExtendedPredicate predicate =
                    new ExtendedPredicate(lex);
                assertTrue(false);
            }catch(ParserException e){
                assertTrue(true);
            };

            try{
                StringReader sr = new StringReader("==(A,B,C");
                Lex lex = new Lex(sr);
                ExtendedPredicate predicate =
                    new ExtendedPredicate(lex);
                assertTrue(false);
            }catch(ParserException e){
                assertTrue(true);
            };

            try{
                StringReader sr = new StringReader("A(");
                Lex lex = new Lex(sr);
                ExtendedPredicate predicate =
                    new ExtendedPredicate(lex);
                assertTrue(false);
            }catch(ParserException e){
                assertTrue(true);
            };

            try{
                StringReader sr = new StringReader("A()");
                Lex lex = new Lex(sr);
                ExtendedPredicate predicate =
                    new ExtendedPredicate(lex);
                assertTrue(false);
            }catch(ParserException e){
                assertTrue(true);
            };

            try{
                StringReader sr = new StringReader("A(A B)");
                Lex lex = new Lex(sr);
                ExtendedPredicate predicate =
                    new ExtendedPredicate(lex);
                assertTrue(false);
            }catch(ParserException e){
                assertTrue(true);
            };

            try{
                StringReader sr = new StringReader("A('A' B)");
                Lex lex = new Lex(sr);
                ExtendedPredicate predicate =
                    new ExtendedPredicate(lex);
                assertTrue(false);
            }catch(ParserException e){
                assertTrue(true);
            };

            try{
                StringReader sr = new StringReader("A(X,)");
                Lex lex = new Lex(sr);
                ExtendedPredicate predicate =
                    new ExtendedPredicate(lex);
                assertTrue(false);
            }catch(ParserException e){
                assertTrue(true);
            };

            StringReader sr = new StringReader("Apple(Id1)");
            Lex lex = new Lex(sr);
            ExtendedPredicate predicate =
                new ExtendedPredicate(lex);
            ArrayList<Node> nodes = predicate.getNodes();
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("Id1"));
            assertTrue(predicate.getName().getValue().equals("Apple"));
            assertTrue(predicate.toString().equals("Apple(Id1)"));
            //assertTrue(predicate.hashCode() == 4542588);

            sr = new StringReader("Apple('Id1')");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("'Id1'"));
            assertTrue(predicate.getName().getValue().equals("Apple"));
            assertTrue(predicate.toString().equals("Apple('Id1')"));
            //assertTrue(predicate.hashCode() == 25247522);

            sr = new StringReader("M(Id1,\n Id2)");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 2);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("Id1"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("Id2"));
            assertTrue(predicate.getName().getValue().equals("M"));
            assertTrue(predicate.toString().equals("M(Id1,Id2)"));
            //assertTrue(predicate.hashCode() == 9085177);

            sr = new StringReader("M(Id1,\n 'Id2')");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 2);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("Id1"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("'Id2'"));
            assertTrue(predicate.getName().getValue().equals("M"));
            assertTrue(predicate.toString().equals("M(Id1,'Id2')"));
            //assertTrue(predicate.hashCode() == 29790111);

            sr = new StringReader("M('Id1',\n Id2)");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 2);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("'Id1'"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("Id2"));
            assertTrue(predicate.getName().getValue().equals("M"));
            assertTrue(predicate.toString().equals("M('Id1',Id2)"));
            //assertTrue(predicate.hashCode() == 29790111);

            sr = new StringReader("M('Id1',\n 'Id2')");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 2);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("'Id1'"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("'Id2'"));
            assertTrue(predicate.getName().getValue().equals("M"));
            assertTrue(predicate.toString().equals("M('Id1','Id2')"));
            //assertTrue(predicate.hashCode() == 50495045);

            sr = new StringReader("List(Name1,\n Name2,\n Name3)");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 3);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(nodes.get(2) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("Name1"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("Name2"));
            assertTrue(((Token)nodes.get(2)).getValue().equals("Name3"));
            assertTrue(predicate.getName().getValue().equals("List"));
            assertTrue(predicate.toString().equals(
               "List(Name1,Name2,Name3)"));
            //assertTrue(predicate.hashCode() == 238504743);

            sr = new StringReader("List(Name1,\n Name2,\n 'Name3')");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 3);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(nodes.get(2) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("Name1"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("Name2"));
            assertTrue(((Token)nodes.get(2)).getValue().equals("'Name3'"));
            assertTrue(predicate.getName().getValue().equals("List"));
            assertTrue(predicate.toString().equals(
               "List(Name1,Name2,'Name3')"));
            //assertTrue(predicate.hashCode() == 259209677);

            sr = new StringReader("List(Name1,\n 'Name2',\n Name3)");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 3);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(nodes.get(2) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("Name1"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("'Name2'"));
            assertTrue(((Token)nodes.get(2)).getValue().equals("Name3"));
            assertTrue(predicate.getName().getValue().equals("List"));
            assertTrue(predicate.toString().equals(
               "List(Name1,'Name2',Name3)"));
            //assertTrue(predicate.hashCode() == 259209677);

            sr = new StringReader("List(Name1,\n 'Name2',\n 'Name3')");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 3);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(nodes.get(2) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("Name1"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("'Name2'"));
            assertTrue(((Token)nodes.get(2)).getValue().equals("'Name3'"));
            assertTrue(predicate.getName().getValue().equals("List"));
            assertTrue(predicate.toString().equals(
               "List(Name1,'Name2','Name3')"));
            //assertTrue(predicate.hashCode() == 279914611);

            sr = new StringReader("List('Name1',\n Name2,\n Name3)");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 3);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(nodes.get(2) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("'Name1'"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("Name2"));
            assertTrue(((Token)nodes.get(2)).getValue().equals("Name3"));
            assertTrue(predicate.getName().getValue().equals("List"));
            assertTrue(predicate.toString().equals(
               "List('Name1',Name2,Name3)"));
            //assertTrue(predicate.hashCode() == 259209677);

            sr = new StringReader("List('Name1',\n Name2,\n 'Name3')");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 3);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(nodes.get(2) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("'Name1'"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("Name2"));
            assertTrue(((Token)nodes.get(2)).getValue().equals("'Name3'"));
            assertTrue(predicate.getName().getValue().equals("List"));
            assertTrue(predicate.toString().equals(
               "List('Name1',Name2,'Name3')"));
            //assertTrue(predicate.hashCode() == 279914611);

            sr = new StringReader("List('Name1',\n 'Name2',\n Name3)");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 3);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(nodes.get(2) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("'Name1'"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("'Name2'"));
            assertTrue(((Token)nodes.get(2)).getValue().equals("Name3"));
            assertTrue(predicate.getName().getValue().equals("List"));
            assertTrue(predicate.toString().equals(
               "List('Name1','Name2',Name3)"));
            //assertTrue(predicate.hashCode() == 279914611);

            sr = new StringReader("List('Name1',\n 'Name2',\n 'Name3')");
            lex = new Lex(sr);
            predicate = new ExtendedPredicate(lex);
            nodes = predicate.getNodes();
            assertTrue(nodes.size() == 3);
            assertTrue(nodes.get(0) instanceof Argument);
            assertTrue(nodes.get(1) instanceof Argument);
            assertTrue(nodes.get(2) instanceof Argument);
            assertTrue(((Token)nodes.get(0)).getValue().equals("'Name1'"));
            assertTrue(((Token)nodes.get(1)).getValue().equals("'Name2'"));
            assertTrue(((Token)nodes.get(2)).getValue().equals("'Name3'"));
            assertTrue(predicate.getName().getValue().equals("List"));
            assertTrue(predicate.toString().equals(
               "List('Name1','Name2','Name3')"));
            //assertTrue(predicate.hashCode() == 300619545);
        }catch(ParserException e){
            System.out.println(
                "ERROR in PredicateTest.testPredicateConstructor\n"+
                "    should not get here.\n" +
                "    error = " + e.getMessage());
        };
    }