1d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar/*
2d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
3d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *
4d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * you may not use this file except in compliance with the License.
6d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * You may obtain a copy of the License at
7d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *
8d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *
10d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * See the License for the specific language governing permissions and
14d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * limitations under the License.
15d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar */
16d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
17fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.tool;
18d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
19d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport org.junit.Before;
20d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport org.junit.Test;
21d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport org.junit.runner.RunWith;
22d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport org.junit.runners.Parameterized;
23d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
24fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.ComparisonExpr;
25fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.Dependency;
26fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.Expr;
27fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.ExprModel;
28fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.FieldAccessExpr;
29fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.IdentifierExpr;
30fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.MethodCallExpr;
31fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.SymbolExpr;
32fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.expr.TernaryExpr;
33fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.Callable;
34fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.java.JavaAnalyzer;
35fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.java.JavaClass;
36fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount
37d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.Arrays;
38d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.List;
39d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
40fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport static org.junit.Assert.assertEquals;
41fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport static org.junit.Assert.assertFalse;
42fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport static org.junit.Assert.assertSame;
43fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport static org.junit.Assert.assertTrue;
44d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
45d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarpublic class ExpressionVisitorTest {
46d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    ExpressionParser mParser = new ExpressionParser(new ExprModel());
47d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
48d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Before
49d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void setUp() throws Exception {
5097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        JavaAnalyzer.initForTests();
51d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
52d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
53d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    private <T extends Expr> T parse(String input, Class<T> klass) {
54c1560e6b00b398867da12fbdc5a1fcd1d50b801cYigit Boyar        final Expr parsed = mParser.parse(input, null);
55d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertSame(klass, parsed.getClass());
56d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return (T) parsed;
57d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
58d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
59d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Test
60d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void testSymbol() {
61d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final SymbolExpr res = parse("null", SymbolExpr.class);
62d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(1, mParser.getModel().size());
63d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("null", res.getText());
6497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        assertEquals(new JavaClass(Object.class),res.getResolvedType());
65d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(0, res.getDependencies().size());
66d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
67d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
68d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
69d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @RunWith(Parameterized.class)
70d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public static class ComparisonExprTests {
71d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        ExpressionParser mParser = new ExpressionParser(new ExprModel());
72d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        private final String mOp;
73d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
74d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        @Before
75d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        public void setUp() throws Exception {
7697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            JavaAnalyzer.initForTests();
77d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        }
78d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
79d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        @Parameterized.Parameters
80d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        public static List<Object[]> data() {
81d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar            return Arrays.asList(new Object[][] {
82d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar                    {"=="}, {"<="}, {">="}, {">"}, {"<"}
83d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar            });
84d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        }
85d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
86d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        public ComparisonExprTests(String op) {
87d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar            mOp = op;
88d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        }
89d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
90d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        @Test
91d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        public void testComparison() {
92c1560e6b00b398867da12fbdc5a1fcd1d50b801cYigit Boyar            final Expr res = mParser.parse("3 " + mOp + " 5", null);
93d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar            assertEquals(3, mParser.getModel().size());
94d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar            assertTrue(res instanceof ComparisonExpr);
95d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar            // 0 because they are both static
96d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar            assertEquals(0, res.getDependencies().size());
97d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        }
98d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
99d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
100d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
101d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
102d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Test
103d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void testSimpleFieldAccess() {
104d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final FieldAccessExpr expr = parse("a.b", FieldAccessExpr.class);
105d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(2, mParser.mModel.size());
106d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("b", expr.getName());
107d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(1, expr.getChildren().size());
108d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final Expr parent = expr.getChildren().get(0);
109d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertTrue(parent instanceof IdentifierExpr);
110d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final IdentifierExpr id = (IdentifierExpr) parent;
111d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("a", id.getName());
112d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(0, id.getDependencies().size());
113d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(1, expr.getDependencies().size());
114d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
115d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
116d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Test
117d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void testIdentifier() {
118d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final IdentifierExpr id = parse("myStr", IdentifierExpr.class);
119d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(1, mParser.mModel.size());
120d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("myStr", id.getName());
121d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        id.setUserDefinedType("java.lang.String");
12297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        assertEquals(new JavaClass(String.class), id.getResolvedType());
123d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
124d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
125d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Test
126d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void testTernary() {
127d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final TernaryExpr parsed = parse("a > b ? 5 : 4", TernaryExpr.class);
128d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(6, mParser.getModel().size());
129d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertTrue(parsed.getPred() instanceof ComparisonExpr);
130d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertTrue(parsed.getIfTrue() instanceof SymbolExpr);
131d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertTrue(parsed.getIfFalse() instanceof SymbolExpr);
132d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        ComparisonExpr pred = (ComparisonExpr) parsed.getPred();
133d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        SymbolExpr ifTrue = (SymbolExpr) parsed.getIfTrue();
134d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        SymbolExpr ifFalse = (SymbolExpr) parsed.getIfFalse();
135d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("5", ifTrue.getText());
136d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("4", ifFalse.getText());
137d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(1, parsed.getDependencies().size());
138d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        for (Dependency dependency : parsed.getDependencies()) {
139d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar            assertEquals(dependency.getOther() != pred, dependency.isConditional());
140d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        }
141d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
142d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
143d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Test
144d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void testInheritedFieldResolution() {
145d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final FieldAccessExpr parsed = parse("myStr.length", FieldAccessExpr.class);
146a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount        assertTrue(parsed.getChild() instanceof IdentifierExpr);
147a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount        final IdentifierExpr id = (IdentifierExpr) parsed.getChild();
148d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        id.setUserDefinedType("java.lang.String");
14997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        assertEquals(new JavaClass(int.class), parsed.getResolvedType());
150e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount        Callable getter = parsed.getGetter();
151e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount        assertEquals(Callable.Type.METHOD, getter.type);
152d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("length", getter.name);
153d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(1, parsed.getDependencies().size());
154d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final Dependency dep = parsed.getDependencies().get(0);
155d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertSame(id, dep.getOther());
156d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertFalse(dep.isConditional());
157d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
158d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
159d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Test
160d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void testGetterResolution() {
161d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final FieldAccessExpr parsed = parse("myStr.bytes", FieldAccessExpr.class);
162a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount        assertTrue(parsed.getChild() instanceof IdentifierExpr);
163a70fed6415aa1e8bbbe929aee776402ac3b81c86George Mount        final IdentifierExpr id = (IdentifierExpr) parsed.getChild();
164d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        id.setUserDefinedType("java.lang.String");
16597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        assertEquals(new JavaClass(byte[].class), parsed.getResolvedType());
166e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount        Callable getter = parsed.getGetter();
167e6c6d3bf4fac3fa11c5780cfd3bc14cdb0caaea1George Mount        assertEquals(Callable.Type.METHOD, getter.type);
168d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("getBytes", getter.name);
169d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(1, parsed.getDependencies().size());
170d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final Dependency dep = parsed.getDependencies().get(0);
171d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertSame(id, dep.getOther());
172d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertFalse(dep.isConditional());
173d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
174d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
175d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Test
176d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void testMethodCall() {
177d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final MethodCallExpr parsed = parse("user.getName()", MethodCallExpr.class);
178d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertTrue(parsed.getTarget() instanceof IdentifierExpr);
179d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("getName", parsed.getName());
180d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(0, parsed.getArgs().size());
181d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(1, parsed.getDependencies().size());
182d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final Dependency dep = parsed.getDependencies().get(0);
183c1560e6b00b398867da12fbdc5a1fcd1d50b801cYigit Boyar        assertSame(mParser.parse("user", null), dep.getOther());
184d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertFalse(dep.isConditional());
185d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
186d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
187d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    @Test
188d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void testMethodCallWithArgs() {
189d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final MethodCallExpr parsed = parse("str.substring(1, a)", MethodCallExpr.class);
190d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertTrue(parsed.getTarget() instanceof IdentifierExpr);
191d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals("substring", parsed.getName());
192d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final List<Expr> args = parsed.getArgs();
193d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(2, args.size());
194d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertTrue(args.get(0) instanceof SymbolExpr);
195d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertTrue(args.get(1) instanceof IdentifierExpr);
196d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final List<Dependency> deps = parsed.getDependencies();
197d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        assertEquals(2, deps.size());
198d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
199d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
200d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar}
201