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