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 
14 package android.databinding.tool;
15 
16 
17 import android.databinding.tool.expr.Expr;
18 import android.databinding.tool.expr.ExprModel;
19 import android.databinding.tool.expr.FieldAccessExpr;
20 import android.databinding.tool.expr.IdentifierExpr;
21 import android.databinding.tool.expr.StaticIdentifierExpr;
22 import android.databinding.tool.reflection.Callable;
23 import android.databinding.tool.reflection.java.JavaAnalyzer;
24 import android.databinding.tool.reflection.java.JavaClass;
25 
26 import org.junit.Before;
27 import org.junit.Test;
28 
29 import java.util.List;
30 import java.util.Map;
31 
32 import static org.junit.Assert.assertEquals;
33 import static org.junit.Assert.assertFalse;
34 import static org.junit.Assert.assertSame;
35 import static org.junit.Assert.assertTrue;
36 
37 public class LayoutBinderTest {
38     MockLayoutBinder mLayoutBinder;
39     ExprModel mExprModel;
40     @Before
setUp()41     public void setUp() throws Exception {
42         mLayoutBinder = new MockLayoutBinder();
43         mExprModel = mLayoutBinder.getModel();
44         JavaAnalyzer.initForTests();
45     }
46 
47     @Test
testRegisterId()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
testRegisterImport()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
testParse()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", false, null);
81         mLayoutBinder.parse("user.lastName", false, 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
testParseWithMethods()94     public void testParseWithMethods() {
95         mLayoutBinder.addVariable("user", "android.databinding.tool.LayoutBinderTest.TestUser",
96                 null);
97         mLayoutBinder.parse("user.fullName", false, 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 
findIdentifier(String name)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 
fullName()125         public String fullName() {
126             return name + " " + lastName;
127         }
128     }
129 }
130