blob: 98405cc22d3f326f242661f6e7390c46c82a7dff [file] [log] [blame]
/*
* Copyright (C) 2012 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 com.android.tools.lint.checks;
import com.android.tools.lint.detector.api.Detector;
import com.android.tools.lint.detector.api.Issue;
@SuppressWarnings("javadoc")
public class ButtonDetectorTest extends AbstractCheckTest {
private static Issue sTestIssue;
@Override
protected boolean isEnabled(Issue issue) {
return super.isEnabled(issue) && sTestIssue == null || issue == sTestIssue;
}
@Override
protected Detector getDetector() {
return new ButtonDetector();
}
public void testButtonOrder() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"res/layout/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"0 errors, 7 warnings\n" +
"",
lintProject(
"apicheck/minsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml",
"res/values/buttonbar-values.xml"));
}
public void testButtonOrder2() throws Exception {
// If the layout is in v14, it had better have the right order
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"res/layout-v14/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v14/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v14/buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v14/buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v14/buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v14/buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v14/buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"0 errors, 7 warnings\n" +
"",
lintProject(
"minsdk5targetsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml=>res/layout-v14/buttonbar.xml",
"res/values/buttonbar-values.xml"));
}
public void testButtonOrder3() throws Exception {
// Similar to test 3, but also complain if the -v version is *higher* than 14
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"res/layout-v16/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v16/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v16/buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v16/buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v16/buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v16/buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-v16/buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"0 errors, 7 warnings\n" +
"",
lintProject(
"minsdk5targetsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml=>res/layout-v16/buttonbar.xml",
"res/values/buttonbar-values.xml"));
}
public void testButtonOrder4() throws Exception {
// Targeting 14 but using a layout that also needs to work for older platforms:
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"res/layout/buttonbar.xml:12: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:44: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:92: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:124: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:140: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:156: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:177: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"0 errors, 7 warnings\n" +
"",
lintProject(
"minsdk5targetsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml",
"res/values/buttonbar-values.xml"));
}
public void testButtonOrder5() throws Exception {
// If the layout is in a non-ICS folder and has the wrong button order,
// but there is a v14 version of the layout, don't complain about the non-v14 version
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"No warnings.",
lintProject(
"minsdk5targetsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml",
"res/layout/layout1.xml=>res/layout-v14/buttonbar.xml",
"res/values/buttonbar-values.xml"));
}
public void testSuppressed() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"No warnings.",
lintProject(
"apicheck/minsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar_suppressed.xml",
"res/values/buttonbar-values.xml"));
}
public void testButtonOrderRelativeLayout() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"No warnings.",
lintProject("res/layout/buttonbar2.xml", "res/values/buttonbar-values.xml"));
}
public void testButtonOrderRelativeLayout2() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"res/layout/buttonbar3.xml:27: Warning: Cancel button should be on the left [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"0 errors, 1 warnings\n" +
"",
lintProject(
"apicheck/minsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar3.xml",
"res/values/buttonbar-values.xml"));
}
public void testButtonOrderRelativeLayout3() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"No warnings.",
lintProject("res/layout/buttonbar4.xml", "res/values/buttonbar-values.xml"));
}
public void testCase() throws Exception {
sTestIssue = ButtonDetector.CASE;
assertEquals(
"res/values/buttonbar-values.xml:9: Warning: The standard Android way to capitalize Ok is \"OK\" (tip: use @android:string/ok instead) [ButtonCase]\n" +
" <string name=\"resume2\"> Ok </string>\n" +
" ^\n" +
"res/values/buttonbar-values.xml:10: Warning: The standard Android way to capitalize CANCEL is \"Cancel\" (tip: use @android:string/cancel instead) [ButtonCase]\n" +
" <string name=\"giveup2\">\"CANCEL\"</string>\n" +
" ^\n" +
"0 errors, 2 warnings\n" +
"",
lintProject("res/layout/buttonbar.xml", "res/values/buttonbar-values.xml"));
}
public void testBack() throws Exception {
sTestIssue = ButtonDetector.BACK_BUTTON;
assertEquals(
"res/layout/buttonbar.xml:183: Warning: Back buttons are not standard on Android; see design guide's navigation section [BackButton]\n" +
" <Button\n" +
" ^\n" +
"0 errors, 1 warnings\n" +
"",
lintProject("res/layout/buttonbar.xml", "res/values/buttonbar-values.xml"));
}
public void testOldApp() throws Exception {
// Target SDK < 14 - no warnings on button order
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"No warnings.",
lintProject(
"minsdk5targetsdk9.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml",
"res/values/buttonbar-values.xml"));
}
public void testEnglishLocales() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
"res/layout-en-rGB/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-en-rGB/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-en-rGB/buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-en-rGB/buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-en-rGB/buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-en-rGB/buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-en-rGB/buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"0 errors, 7 warnings\n" +
"",
lintProject(
"apicheck/minsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml=>res/layout-en-rGB/buttonbar.xml",
"res/values/buttonbar-values.xml=>res/values-en-rGB/buttonbar-values.xml"));
}
public void testOtherLocales() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
// Hardcoded values only
"res/layout-de/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"res/layout-de/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
" <Button\n" +
" ^\n" +
"0 errors, 2 warnings\n" +
"",
lintProject(
"apicheck/minsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml=>res/layout-de/buttonbar.xml",
"res/values/buttonbar-values.xml=>res/values-de/buttonbar-values.xml"));
}
public void testOtherLocales2() throws Exception {
sTestIssue = ButtonDetector.CASE;
assertEquals(
"No warnings.",
lintProject("res/layout/buttonbar.xml=>res/layout-de/buttonbar.xml",
"res/values/buttonbar-values.xml=>res/values-de/buttonbar-values.xml"));
}
public void testButtonStyle() throws Exception {
sTestIssue = ButtonDetector.STYLE;
assertEquals(
"res/layout/buttonbar.xml:12: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:17: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:28: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:33: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:44: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:49: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:60: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:65: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:76: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:81: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:92: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:97: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:108: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:113: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:124: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:129: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:140: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:145: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:156: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"res/layout/buttonbar.xml:161: Warning: Buttons in button bars should be borderless; use style=\"?android:attr/buttonBarButtonStyle\" (and ?android:attr/buttonBarStyle on the parent) [ButtonStyle]\n" +
" <Button\n" +
" ^\n" +
"0 errors, 20 warnings\n",
lintProject(
"apicheck/minsdk14.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml",
"res/layout/buttonbar2.xml",
"res/layout/buttonbar3.xml",
"res/values/buttonbar-values.xml"));
}
public void testButtonStyleOldMinSdk() throws Exception {
sTestIssue = ButtonDetector.STYLE;
assertEquals(
"No warnings.",
lintProject(
"apicheck/minsdk4.xml=>AndroidManifest.xml",
"res/layout/buttonbar.xml",
"res/layout/buttonbar2.xml",
"res/layout/buttonbar3.xml",
"res/values/buttonbar-values.xml"));
}
public void testYesNo() throws Exception {
sTestIssue = ButtonDetector.CASE;
assertEquals(""
+ "res/layout/yesno.xml:10: Warning: @android:string/yes actually returns \"OK\", not \"Yes\"; use @android:string/ok instead or create a local string resource for Yes [ButtonCase]\n"
+ " android:text=\"@android:string/yes\" />\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/yesno.xml:15: Warning: @android:string/no actually returns \"Cancel\", not \"No\"; use @android:string/cancel instead or create a local string resource for No [ButtonCase]\n"
+ " android:text=\"@android:string/no\" />\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "0 errors, 2 warnings\n",
lintProject(
"apicheck/minsdk4.xml=>AndroidManifest.xml",
"res/layout/yesno.xml"));
}
public void testIssue180417() throws Exception {
// Regression test for
// https://code.google.com/p/android/issues/detail?id=180417
sTestIssue = ButtonDetector.CASE;
assertEquals(""
+ "res/values/buttonbar-values.xml:4: Warning: The standard Android way to capitalize Ok is \"OK\" (tip: use @android:string/ok instead) [ButtonCase]\n"
+ " <string name=\"ok\">\"Ok\"</string>\n"
+ " ^\n"
+ "0 errors, 1 warnings\n",
lintProject(
xml("res/values/buttonbar-values.xml", ""
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<resources>\n"
+ "\n"
+ " <string name=\"ok\">\"Ok\"</string>\n"
+ "\n"
+ "</resources>\n"),
xml("res/layout/buttonbar", ""
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
+ " android:layout_width=\"match_parent\"\n"
+ " android:layout_height=\"match_parent\"\n"
+ " android:orientation=\"vertical\" >\n"
+ " <LinearLayout\n"
+ " android:layout_width=\"match_parent\"\n"
+ " android:layout_height=\"wrap_content\" >\n"
+ "\n"
+ " <Button\n"
+ " android:layout_width=\"wrap_content\"\n"
+ " android:layout_height=\"wrap_content\"\n"
+ " android:text=\"@string/cancel\" />\n"
+ "\n"
+ " <Button\n"
+ " android:layout_width=\"wrap_content\"\n"
+ " android:layout_height=\"wrap_content\"\n"
+ " android:text=\"@string/ok\" />\n"
+ " </LinearLayout>\n"
+ "</LinearLayout>\n"))
);
}
public void testIssue101279() throws Exception {
// Regression test for https://code.google.com/p/android/issues/detail?id=101279
sTestIssue = ButtonDetector.STYLE;
assertEquals(
"No warnings.",
lintProject(
"apicheck/minsdk4.xml=>AndroidManifest.xml",
"res/layout/buttonbar5.xml"));
}
}