| /* |
| * 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")); |
| } |
| } |