1aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar/*
2aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
3aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar *
4aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar * you may not use this file except in compliance with the License.
6aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar * You may obtain a copy of the License at
7aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar *
8aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar *
10aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar * See the License for the specific language governing permissions and
14aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar * limitations under the License.
15aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar */
16aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
17aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarpackage android.databinding.compilationTest;
18aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
19aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport org.junit.Test;
20aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
21aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport android.databinding.tool.processing.ErrorMessages;
22aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport android.databinding.tool.processing.ScopedErrorReport;
23aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport android.databinding.tool.processing.ScopedException;
24aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport android.databinding.tool.store.Location;
25aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
26aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport java.io.File;
27aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport java.io.IOException;
28aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport java.net.URISyntaxException;
29aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport java.util.List;
30aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
31aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport static org.junit.Assert.assertEquals;
32aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport static org.junit.Assert.assertNotEquals;
33aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport static org.junit.Assert.assertNotNull;
34aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport static org.junit.Assert.assertTrue;
35aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarimport static org.junit.Assert.fail;
36aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
37aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyarpublic class MultiLayoutVerificationTest extends BaseCompilationTest {
38aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    @Test
39aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    public void testMultipleLayoutFilesWithNameMismatch()
40aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            throws IOException, URISyntaxException, InterruptedException {
41aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        prepareProject();
42aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        copyResourceTo("/layout/layout_with_class_name.xml",
43aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                "/app/src/main/res/layout/with_class_name.xml", toMap(KEY_CLASS_NAME,
44aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                        "AClassName"));
45aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        copyResourceTo("/layout/layout_with_class_name.xml",
46aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                "/app/src/main/res/layout-land/with_class_name.xml", toMap(KEY_CLASS_NAME,
47aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                        "SomeOtherClassName"));
48aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        CompilationResult result = runGradle("assembleDebug");
49aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertNotEquals(result.output, 0, result.resultCode);
50aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        List<ScopedException> exceptions = result.getBindingExceptions();
51aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertEquals(result.error, 2, exceptions.size());
52aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        boolean foundNormal = false;
53aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        boolean foundLandscape = false;
54aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        for (ScopedException exception : exceptions) {
55aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            ScopedErrorReport report = exception.getScopedErrorReport();
56aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertNotNull(report);
57aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            File file = new File(report.getFilePath());
58aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertTrue(file.exists());
59aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(1, report.getLocations().size());
60aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            Location location = report.getLocations().get(0);
619784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            String name = file.getParentFile().getName();
629784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            if ("layout".equals(name)) {
639784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                assertEquals(new File(testFolder,
649784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                        "/app/src/main/res/layout/with_class_name.xml")
659784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                        .getCanonicalFile(), file.getCanonicalFile());
669784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                String extract = extract("/app/src/main/res/layout/with_class_name.xml",
679784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                        location);
689784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                assertEquals(extract, "AClassName");
699784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                assertEquals(String.format(
709784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                        ErrorMessages.MULTI_CONFIG_LAYOUT_CLASS_NAME_MISMATCH,
719784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                        DEFAULT_APP_PACKAGE + ".databinding.AClassName",
729784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                        "layout/with_class_name"), exception.getBareMessage());
739784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                foundNormal = true;
749784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            } else if ("layout-land".equals(name)) {
75aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    assertEquals(new File(testFolder,
76aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                            "/app/src/main/res/layout-land/with_class_name.xml")
77aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                            .getCanonicalFile(), file.getCanonicalFile());
789784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                    String extract = extract("/app/src/main/res/layout-land/with_class_name.xml",
79aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                            location);
80aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    assertEquals("SomeOtherClassName", extract);
81aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    assertEquals(String.format(
82aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                            ErrorMessages.MULTI_CONFIG_LAYOUT_CLASS_NAME_MISMATCH,
83aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                            DEFAULT_APP_PACKAGE + ".databinding.SomeOtherClassName",
84aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                            "layout-land/with_class_name"), exception.getBareMessage());
85aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    foundLandscape = true;
869784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            } else {
879784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                fail("unexpected error file");
88aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            }
89aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        }
909784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar        assertTrue("should find default config error\n" + result.error, foundNormal);
919784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar        assertTrue("should find landscape error\n" + result.error, foundLandscape);
92aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    }
93aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
94aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    @Test
95aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    public void testMultipleLayoutFilesVariableMismatch()
96aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            throws IOException, URISyntaxException, InterruptedException {
97aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        prepareProject();
98aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        copyResourceTo("/layout/layout_with_variable_type.xml",
99aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                "/app/src/main/res/layout/layout_with_variable_type.xml", toMap(KEY_CLASS_TYPE,
100aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                        "String"));
101aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        copyResourceTo("/layout/layout_with_variable_type.xml",
102aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                "/app/src/main/res/layout-land/layout_with_variable_type.xml", toMap(KEY_CLASS_TYPE,
103aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                        "CharSequence"));
104aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        CompilationResult result = runGradle("assembleDebug");
105aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertNotEquals(result.output, 0, result.resultCode);
106aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        List<ScopedException> exceptions = result.getBindingExceptions();
107aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertEquals(result.error, 2, exceptions.size());
108aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        boolean foundNormal = false;
109aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        boolean foundLandscape = false;
110aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        for (ScopedException exception : exceptions) {
111aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            ScopedErrorReport report = exception.getScopedErrorReport();
112aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertNotNull(report);
113aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            File file = new File(report.getFilePath());
114aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertTrue(file.exists());
115aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(result.error, 1, report.getLocations().size());
116aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            Location location = report.getLocations().get(0);
117aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            // validated in switch
1189784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            String name = file.getParentFile().getName();
1199784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            String config = name;
120aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            String type = "???";
1219784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            if ("layout".equals(name)) {
1229784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                type = "String";
1239784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                foundNormal = true;
1249784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            } else if ("layout-land".equals(name)) {
1259784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                type = "CharSequence";
1269784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                foundLandscape = true;
1279784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            } else {
1289784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                fail("unexpected error file");
129aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            }
130aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(new File(testFolder,
131aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    "/app/src/main/res/" + config + "/layout_with_variable_type.xml")
132aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    .getCanonicalFile(), file.getCanonicalFile());
133aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            String extract = extract("/app/src/main/res/" + config +
134aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                            "/layout_with_variable_type.xml", location);
135aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(extract, "<variable name=\"myVariable\" type=\"" + type + "\"/>");
136aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(String.format(
137aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    ErrorMessages.MULTI_CONFIG_VARIABLE_TYPE_MISMATCH,
138aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    "myVariable", type,
139aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    config + "/layout_with_variable_type"), exception.getBareMessage());
140aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        }
141aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertTrue(result.error, foundNormal);
142aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertTrue(result.error, foundLandscape);
143aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    }
144aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
145aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    @Test
146aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    public void testMultipleLayoutFilesImportMismatch()
147aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            throws IOException, URISyntaxException, InterruptedException {
148aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        prepareProject();
149aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        String typeNormal = "java.util.List";
150aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        String typeLand = "java.util.Map";
151aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        copyResourceTo("/layout/layout_with_import_type.xml",
152aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                "/app/src/main/res/layout/layout_with_import_type.xml", toMap(KEY_IMPORT_TYPE,
153aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                        typeNormal));
154aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        copyResourceTo("/layout/layout_with_import_type.xml",
155aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                "/app/src/main/res/layout-land/layout_with_import_type.xml", toMap(KEY_IMPORT_TYPE,
156aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                        typeLand));
157aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        CompilationResult result = runGradle("assembleDebug");
158aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertNotEquals(result.output, 0, result.resultCode);
159aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        List<ScopedException> exceptions = result.getBindingExceptions();
160aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertEquals(result.error, 2, exceptions.size());
161aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        boolean foundNormal = false;
162aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        boolean foundLandscape = false;
163aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        for (ScopedException exception : exceptions) {
164aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            ScopedErrorReport report = exception.getScopedErrorReport();
165aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertNotNull(report);
166aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            File file = new File(report.getFilePath());
167aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertTrue(file.exists());
168aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(result.error, 1, report.getLocations().size());
169aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            Location location = report.getLocations().get(0);
170aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            // validated in switch
1719784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            String name = file.getParentFile().getName();
1729784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            String config = name;
173aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            String type = "???";
1749784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            if ("layout".equals(name)) {
1759784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                type = typeNormal;
1769784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                foundNormal = true;
1779784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            } else if ("layout-land".equals(name)) {
1789784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                type = typeLand;
1799784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                foundLandscape = true;
1809784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            } else {
1819784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                fail("unexpected error file");
182aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            }
183aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(new File(testFolder,
184aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    "/app/src/main/res/" + config + "/layout_with_import_type.xml")
185aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    .getCanonicalFile(), file.getCanonicalFile());
186aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            String extract = extract("/app/src/main/res/" + config + "/layout_with_import_type.xml",
187aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    location);
188aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(extract, "<import alias=\"Blah\" type=\"" + type + "\"/>");
189aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(String.format(
190aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    ErrorMessages.MULTI_CONFIG_IMPORT_TYPE_MISMATCH,
191aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    "Blah", type,
192aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    config + "/layout_with_import_type"), exception.getBareMessage());
193aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        }
194aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertTrue(result.error, foundNormal);
195aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertTrue(result.error, foundLandscape);
196aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    }
197aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
198aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    @Test
199aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    public void testSameIdInIncludeAndView()
200aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            throws IOException, URISyntaxException, InterruptedException {
201aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        prepareProject();
202aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        copyResourceTo("/layout/basic_layout.xml",
203aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                "/app/src/main/res/layout/basic_layout.xml");
204aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        copyResourceTo("/layout/layout_with_include.xml",
205aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                "/app/src/main/res/layout/foo.xml", toMap(KEY_INCLUDE_ID, "sharedId"));
206aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        copyResourceTo("/layout/layout_with_view_id.xml",
207aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                "/app/src/main/res/layout-land/foo.xml", toMap(KEY_VIEW_ID, "sharedId"));
208aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        CompilationResult result = runGradle("assembleDebug");
209aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertNotEquals(result.output, 0, result.resultCode);
210aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        List<ScopedException> exceptions = result.getBindingExceptions();
211aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertEquals(result.error, 2, exceptions.size());
212aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
213aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        boolean foundNormal = false;
214aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        boolean foundLandscape = false;
215aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        for (ScopedException exception : exceptions) {
216aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            ScopedErrorReport report = exception.getScopedErrorReport();
217aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertNotNull(report);
218aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            File file = new File(report.getFilePath());
219aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertTrue(file.exists());
220aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(result.error, 1, report.getLocations().size());
221aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            Location location = report.getLocations().get(0);
222aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            // validated in switch
223aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            String config = file.getParentFile().getName();
2249784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            if ("layout".equals(config)) {
2259784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                String extract = extract("/app/src/main/res/" + config + "/foo.xml", location);
2269784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                assertEquals(extract, "<include layout=\"@layout/basic_layout\" "
2279784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                        + "android:id=\"@+id/sharedId\" bind:myVariable=\"@{myVariable}\"/>");
2289784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                foundNormal = true;
2299784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            } else if ("layout-land".equals(config)) {
2309784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                String extract = extract("/app/src/main/res/" + config + "/foo.xml", location);
2319784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                assertEquals(extract, "<TextView android:layout_width=\"wrap_content\" "
2329784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                        + "android:layout_height=\"wrap_content\" android:id=\"@+id/sharedId\" "
2339784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                        + "android:text=\"@{myVariable}\"/>");
2349784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                foundLandscape = true;
2359784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar            } else {
2369784c9aaedeb863018f5fcaa0a598e8e2f8ed2f3Yigit Boyar                fail("unexpected error file");
237aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            }
238aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(new File(testFolder,
239aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    "/app/src/main/res/" + config + "/foo.xml").getCanonicalFile(),
240aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    file.getCanonicalFile());
241aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar            assertEquals(String.format(
242aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    ErrorMessages.MULTI_CONFIG_ID_USED_AS_IMPORT, "@+id/sharedId"),
243aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar                    exception.getBareMessage());
244aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        }
245aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertTrue(result.error, foundNormal);
246aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar        assertTrue(result.error, foundLandscape);
247aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar    }
248aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
249aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar
250aafbe5a2394ff9826201cca97d3298a9f355e311Yigit Boyar}
251