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