LayoutBinderTest.java revision 8dcc185bbd1b1e3654c6018a740b6e33283d908b
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *      http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
12 */
13
14package android.databinding.tool;
15
16
17import org.junit.Before;
18import org.junit.Test;
19
20import android.databinding.tool.expr.Expr;
21import android.databinding.tool.expr.ExprModel;
22import android.databinding.tool.expr.FieldAccessExpr;
23import android.databinding.tool.expr.IdentifierExpr;
24import android.databinding.tool.expr.StaticIdentifierExpr;
25import android.databinding.tool.reflection.Callable;
26import android.databinding.tool.reflection.java.JavaAnalyzer;
27import android.databinding.tool.reflection.java.JavaClass;
28
29import java.util.List;
30import java.util.Map;
31
32import static org.junit.Assert.assertEquals;
33import static org.junit.Assert.assertFalse;
34import static org.junit.Assert.assertSame;
35import static org.junit.Assert.assertTrue;
36
37public class LayoutBinderTest {
38    MockLayoutBinder mLayoutBinder;
39    ExprModel mExprModel;
40    @Before
41    public void setUp() throws Exception {
42        mLayoutBinder = new MockLayoutBinder();
43        mExprModel = mLayoutBinder.getModel();
44        JavaAnalyzer.initForTests();
45    }
46
47    @Test
48    public void testRegisterId() {
49        int originalSize = mExprModel.size();
50        mLayoutBinder.addVariable("test", "java.lang.String", null);
51        assertEquals(originalSize + 1, mExprModel.size());
52        final Map.Entry<String, Expr> entry = findIdentifier("test");
53        final Expr value = entry.getValue();
54        assertEquals(value.getClass(), IdentifierExpr.class);
55        final IdentifierExpr id = (IdentifierExpr) value;
56        assertEquals("test", id.getName());
57        assertEquals(new JavaClass(String.class), id.getResolvedType());
58        assertTrue(id.isDynamic());
59    }
60
61    @Test
62    public void testRegisterImport() {
63        int originalSize = mExprModel.size();
64        mExprModel.addImport("test", "java.lang.String", null);
65        assertEquals(originalSize + 1, mExprModel.size());
66        final Map.Entry<String, Expr> entry = findIdentifier("test");
67        final Expr value = entry.getValue();
68        assertEquals(value.getClass(), StaticIdentifierExpr.class);
69        final IdentifierExpr id = (IdentifierExpr) value;
70        assertEquals("test", id.getName());
71        assertEquals(new JavaClass(String.class), id.getResolvedType());
72        assertFalse(id.isDynamic());
73    }
74
75    @Test
76    public void testParse() {
77        int originalSize = mExprModel.size();
78        mLayoutBinder.addVariable("user", "android.databinding.tool2.LayoutBinderTest.TestUser",
79                null);
80        mLayoutBinder.parse("user.name", null);
81        mLayoutBinder.parse("user.lastName", null);
82        assertEquals(originalSize + 3, mExprModel.size());
83        final List<Expr> bindingExprs = mExprModel.getBindingExpressions();
84        assertEquals(2, bindingExprs.size());
85        IdentifierExpr id = mExprModel.identifier("user");
86        assertTrue(bindingExprs.get(0) instanceof FieldAccessExpr);
87        assertTrue(bindingExprs.get(1) instanceof FieldAccessExpr);
88        assertEquals(2, id.getParents().size());
89        assertTrue(bindingExprs.get(0).getChildren().contains(id));
90        assertTrue(bindingExprs.get(1).getChildren().contains(id));
91    }
92
93    @Test
94    public void testParseWithMethods() {
95        mLayoutBinder.addVariable("user", "android.databinding.tool.LayoutBinderTest.TestUser",
96                null);
97        mLayoutBinder.parse("user.fullName", null);
98        Expr item = mExprModel.getBindingExpressions().get(0);
99        assertTrue(item instanceof FieldAccessExpr);
100        IdentifierExpr id = mExprModel.identifier("user");
101        FieldAccessExpr fa = (FieldAccessExpr) item;
102        fa.getResolvedType();
103        final Callable getter = fa.getGetter();
104        assertTrue(getter.type == Callable.Type.METHOD);
105        assertSame(id, fa.getChild());
106        assertTrue(fa.isDynamic());
107    }
108
109    private Map.Entry<String, Expr> findIdentifier(String name) {
110        for (Map.Entry<String, Expr> entry : mExprModel.getExprMap().entrySet()) {
111            if (entry.getValue() instanceof IdentifierExpr) {
112                IdentifierExpr expr = (IdentifierExpr) entry.getValue();
113                if (name.equals(expr.getName())) {
114                    return entry;
115                }
116            }
117        }
118        return null;
119    }
120
121    static class TestUser {
122        public String name;
123        public String lastName;
124
125        public String fullName() {
126            return name + " " + lastName;
127        }
128    }
129}
130