/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.databinding.compilationTest; import org.junit.Test; import android.databinding.tool.processing.ErrorMessages; import android.databinding.tool.processing.ScopedErrorReport; import android.databinding.tool.processing.ScopedException; import android.databinding.tool.store.Location; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class MultiLayoutVerificationTest extends BaseCompilationTest { @Test public void testMultipleLayoutFilesWithNameMismatch() throws IOException, URISyntaxException, InterruptedException { prepareProject(); copyResourceTo("/layout/layout_with_class_name.xml", "/app/src/main/res/layout/with_class_name.xml", toMap(KEY_CLASS_NAME, "AClassName")); copyResourceTo("/layout/layout_with_class_name.xml", "/app/src/main/res/layout-land/with_class_name.xml", toMap(KEY_CLASS_NAME, "SomeOtherClassName")); CompilationResult result = runGradle("assembleDebug"); assertNotEquals(result.output, 0, result.resultCode); List<ScopedException> exceptions = result.getBindingExceptions(); assertEquals(result.error, 2, exceptions.size()); boolean foundNormal = false; boolean foundLandscape = false; for (ScopedException exception : exceptions) { ScopedErrorReport report = exception.getScopedErrorReport(); assertNotNull(report); File file = new File(report.getFilePath()); assertTrue(file.exists()); assertEquals(1, report.getLocations().size()); Location location = report.getLocations().get(0); switch (file.getParentFile().getName()) { case "layout": assertEquals(new File(testFolder, "/app/src/main/res/layout/with_class_name.xml") .getCanonicalFile(), file.getCanonicalFile()); String extract = extract("/app/src/main/res/layout/with_class_name.xml", location); assertEquals(extract, "AClassName"); assertEquals(String.format( ErrorMessages.MULTI_CONFIG_LAYOUT_CLASS_NAME_MISMATCH, DEFAULT_APP_PACKAGE + ".databinding.AClassName", "layout/with_class_name"), exception.getBareMessage()); foundNormal = true; break; case "layout-land": assertEquals(new File(testFolder, "/app/src/main/res/layout-land/with_class_name.xml") .getCanonicalFile(), file.getCanonicalFile()); extract = extract("/app/src/main/res/layout-land/with_class_name.xml", location); assertEquals("SomeOtherClassName", extract); assertEquals(String.format( ErrorMessages.MULTI_CONFIG_LAYOUT_CLASS_NAME_MISMATCH, DEFAULT_APP_PACKAGE + ".databinding.SomeOtherClassName", "layout-land/with_class_name"), exception.getBareMessage()); foundLandscape = true; break; default: fail("unexpected error file"); } } assertTrue(result.error, foundNormal); assertTrue(result.error, foundLandscape); } @Test public void testMultipleLayoutFilesVariableMismatch() throws IOException, URISyntaxException, InterruptedException { prepareProject(); copyResourceTo("/layout/layout_with_variable_type.xml", "/app/src/main/res/layout/layout_with_variable_type.xml", toMap(KEY_CLASS_TYPE, "String")); copyResourceTo("/layout/layout_with_variable_type.xml", "/app/src/main/res/layout-land/layout_with_variable_type.xml", toMap(KEY_CLASS_TYPE, "CharSequence")); CompilationResult result = runGradle("assembleDebug"); assertNotEquals(result.output, 0, result.resultCode); List<ScopedException> exceptions = result.getBindingExceptions(); assertEquals(result.error, 2, exceptions.size()); boolean foundNormal = false; boolean foundLandscape = false; for (ScopedException exception : exceptions) { ScopedErrorReport report = exception.getScopedErrorReport(); assertNotNull(report); File file = new File(report.getFilePath()); assertTrue(file.exists()); assertEquals(result.error, 1, report.getLocations().size()); Location location = report.getLocations().get(0); // validated in switch String config = file.getParentFile().getName(); String type = "???"; switch (file.getParentFile().getName()) { case "layout": type = "String"; foundNormal = true; break; case "layout-land": type = "CharSequence"; foundLandscape = true; break; default: fail("unexpected error file"); } assertEquals(new File(testFolder, "/app/src/main/res/" + config + "/layout_with_variable_type.xml") .getCanonicalFile(), file.getCanonicalFile()); String extract = extract("/app/src/main/res/" + config + "/layout_with_variable_type.xml", location); assertEquals(extract, "<variable name=\"myVariable\" type=\"" + type + "\"/>"); assertEquals(String.format( ErrorMessages.MULTI_CONFIG_VARIABLE_TYPE_MISMATCH, "myVariable", type, config + "/layout_with_variable_type"), exception.getBareMessage()); } assertTrue(result.error, foundNormal); assertTrue(result.error, foundLandscape); } @Test public void testMultipleLayoutFilesImportMismatch() throws IOException, URISyntaxException, InterruptedException { prepareProject(); String typeNormal = "java.util.List"; String typeLand = "java.util.Map"; copyResourceTo("/layout/layout_with_import_type.xml", "/app/src/main/res/layout/layout_with_import_type.xml", toMap(KEY_IMPORT_TYPE, typeNormal)); copyResourceTo("/layout/layout_with_import_type.xml", "/app/src/main/res/layout-land/layout_with_import_type.xml", toMap(KEY_IMPORT_TYPE, typeLand)); CompilationResult result = runGradle("assembleDebug"); assertNotEquals(result.output, 0, result.resultCode); List<ScopedException> exceptions = result.getBindingExceptions(); assertEquals(result.error, 2, exceptions.size()); boolean foundNormal = false; boolean foundLandscape = false; for (ScopedException exception : exceptions) { ScopedErrorReport report = exception.getScopedErrorReport(); assertNotNull(report); File file = new File(report.getFilePath()); assertTrue(file.exists()); assertEquals(result.error, 1, report.getLocations().size()); Location location = report.getLocations().get(0); // validated in switch String config = file.getParentFile().getName(); String type = "???"; switch (file.getParentFile().getName()) { case "layout": type = typeNormal; foundNormal = true; break; case "layout-land": type = typeLand; foundLandscape = true; break; default: fail("unexpected error file"); } assertEquals(new File(testFolder, "/app/src/main/res/" + config + "/layout_with_import_type.xml") .getCanonicalFile(), file.getCanonicalFile()); String extract = extract("/app/src/main/res/" + config + "/layout_with_import_type.xml", location); assertEquals(extract, "<import alias=\"Blah\" type=\"" + type + "\"/>"); assertEquals(String.format( ErrorMessages.MULTI_CONFIG_IMPORT_TYPE_MISMATCH, "Blah", type, config + "/layout_with_import_type"), exception.getBareMessage()); } assertTrue(result.error, foundNormal); assertTrue(result.error, foundLandscape); } @Test public void testSameIdInIncludeAndView() throws IOException, URISyntaxException, InterruptedException { prepareProject(); copyResourceTo("/layout/basic_layout.xml", "/app/src/main/res/layout/basic_layout.xml"); copyResourceTo("/layout/layout_with_include.xml", "/app/src/main/res/layout/foo.xml", toMap(KEY_INCLUDE_ID, "sharedId")); copyResourceTo("/layout/layout_with_view_id.xml", "/app/src/main/res/layout-land/foo.xml", toMap(KEY_VIEW_ID, "sharedId")); CompilationResult result = runGradle("assembleDebug"); assertNotEquals(result.output, 0, result.resultCode); List<ScopedException> exceptions = result.getBindingExceptions(); assertEquals(result.error, 2, exceptions.size()); boolean foundNormal = false; boolean foundLandscape = false; for (ScopedException exception : exceptions) { ScopedErrorReport report = exception.getScopedErrorReport(); assertNotNull(report); File file = new File(report.getFilePath()); assertTrue(file.exists()); assertEquals(result.error, 1, report.getLocations().size()); Location location = report.getLocations().get(0); // validated in switch String config = file.getParentFile().getName(); switch (file.getParentFile().getName()) { case "layout": String extract = extract("/app/src/main/res/" + config + "/foo.xml", location); assertEquals(extract, "<include layout=\"@layout/basic_layout\" " + "android:id=\"@+id/sharedId\" bind:myVariable=\"@{myVariable}\"/>"); foundNormal = true; break; case "layout-land": extract = extract("/app/src/main/res/" + config + "/foo.xml", location); assertEquals(extract, "<TextView android:layout_width=\"wrap_content\" " + "android:layout_height=\"wrap_content\" android:id=\"@+id/sharedId\" " + "android:text=\"@{myVariable}\"/>"); foundLandscape = true; break; default: fail("unexpected error file"); } assertEquals(new File(testFolder, "/app/src/main/res/" + config + "/foo.xml").getCanonicalFile(), file.getCanonicalFile()); assertEquals(String.format( ErrorMessages.MULTI_CONFIG_ID_USED_AS_IMPORT, "@+id/sharedId"), exception.getBareMessage()); } assertTrue(result.error, foundNormal); assertTrue(result.error, foundLandscape); } }