blob: 32157873bd2918769b3dc7f5b6f398eb9202b16c [file] [log] [blame]
/*
* Copyright (C) 2011 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;
@SuppressWarnings("javadoc")
public class DuplicateIdDetectorTest extends AbstractCheckTest {
@Override
protected Detector getDetector() {
return new DuplicateIdDetector();
}
public void testDuplicate() throws Exception {
assertEquals(
"res/layout/duplicate.xml:5: Error: Duplicate id @+id/android_logo, already defined earlier in this layout [DuplicateIds]\n" +
" <ImageButton android:id=\"@+id/android_logo\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\" android:src=\"@drawable/android_button\" android:focusable=\"false\" android:clickable=\"false\" android:layout_weight=\"1.0\" />\n" +
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
" res/layout/duplicate.xml:4: @+id/android_logo originally defined here\n" +
"1 errors, 0 warnings\n" +
"",
lintFiles("res/layout/duplicate.xml"));
}
public void testDuplicateChains() throws Exception {
assertEquals(
"res/layout/layout1.xml:7: Warning: Duplicate id @+id/button1, defined or included multiple times in layout/layout1.xml: [layout/layout1.xml defines @+id/button1, layout/layout1.xml => layout/layout2.xml => layout/layout3.xml defines @+id/button1, layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button1] [DuplicateIncludedIds]\n" +
" <include\n" +
" ^\n" +
" res/layout/layout1.xml:13: Defined here\n" +
" res/layout/layout3.xml:8: Defined here, included via layout/layout1.xml => layout/layout2.xml => layout/layout3.xml defines @+id/button1\n" +
" res/layout/layout4.xml:8: Defined here, included via layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button1\n" +
"res/layout/layout1.xml:7: Warning: Duplicate id @+id/button2, defined or included multiple times in layout/layout1.xml: [layout/layout1.xml defines @+id/button2, layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button2] [DuplicateIncludedIds]\n" +
" <include\n" +
" ^\n" +
" res/layout/layout1.xml:19: Defined here\n" +
" res/layout/layout4.xml:14: Defined here, included via layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button2\n" +
"res/layout/layout2.xml:18: Warning: Duplicate id @+id/button1, defined or included multiple times in layout/layout2.xml: [layout/layout2.xml => layout/layout3.xml defines @+id/button1, layout/layout2.xml => layout/layout4.xml defines @+id/button1] [DuplicateIncludedIds]\n" +
" <include\n" +
" ^\n" +
" res/layout/layout3.xml:8: Defined here, included via layout/layout2.xml => layout/layout3.xml defines @+id/button1\n" +
" res/layout/layout4.xml:8: Defined here, included via layout/layout2.xml => layout/layout4.xml defines @+id/button1\n" +
"0 errors, 3 warnings\n" +
"",
// layout1: defines @+id/button1, button2
// layout3: defines @+id/button1
// layout4: defines @+id/button1, button2
// layout1 include layout2
// layout2 includes layout3 and layout4
// Therefore, layout3 and layout4 have no problems
// In layout2, there's a duplicate definition of button1 (coming from 3 and 4)
// In layout1, there's a duplicate definition of button1 (coming from layout1, 3 and 4)
// In layout1, there'sa duplicate definition of button2 (coming from 1 and 4)
lintProject("res/layout/layout1.xml", "res/layout/layout2.xml",
"res/layout/layout3.xml", "res/layout/layout4.xml"));
}
public void testSuppress() throws Exception {
assertEquals(
"res/layout/layout2.xml:18: Warning: Duplicate id @+id/button1, defined or included multiple times in layout/layout2.xml: [layout/layout2.xml => layout/layout3.xml defines @+id/button1, layout/layout2.xml => layout/layout4.xml defines @+id/button1] [DuplicateIncludedIds]\n" +
" <include\n" +
" ^\n" +
" res/layout/layout3.xml:8: Defined here, included via layout/layout2.xml => layout/layout3.xml defines @+id/button1\n" +
" res/layout/layout4.xml:8: Defined here, included via layout/layout2.xml => layout/layout4.xml defines @+id/button1\n" +
"0 errors, 1 warnings\n" +
"",
lintProject(
"res/layout/layout1_ignore.xml=>res/layout/layout1.xml",
"res/layout/layout2.xml",
"res/layout/layout3.xml",
"res/layout/layout4.xml"));
}
}