001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.tools.ant.taskdefs.optional.depend;
020:
021: import java.util.Hashtable;
022:
023: import org.apache.tools.ant.BuildFileTest;
024: import org.apache.tools.ant.DirectoryScanner;
025: import org.apache.tools.ant.types.FileSet;
026:
027: /**
028: * Testcase for the Depend optional task.
029: *
030: */
031: public class DependTest extends BuildFileTest {
032: public static final String RESULT_FILESET = "result";
033:
034: public static final String TEST_BUILD_FILE = "src/etc/testcases/taskdefs/optional/depend/depend.xml";
035:
036: public DependTest(String name) {
037: super (name);
038: }
039:
040: public void setUp() {
041: configureProject(TEST_BUILD_FILE);
042: }
043:
044: public void tearDown() {
045: executeTarget("clean");
046: }
047:
048: /**
049: * Test direct dependency removal
050: */
051: public void testDirect() {
052: executeTarget("testdirect");
053: Hashtable files = getResultFiles();
054: assertEquals("Depend did not leave correct number of files", 3,
055: files.size());
056: assertTrue("Result did not contain A.class", files
057: .containsKey("A.class"));
058: assertTrue("Result did not contain D.class", files
059: .containsKey("D.class"));
060: }
061:
062: /**
063: * Test dependency traversal (closure)
064: */
065: public void testClosure() {
066: executeTarget("testclosure");
067: Hashtable files = getResultFiles();
068: assertTrue("Depend did not leave correct number of files",
069: files.size() <= 2);
070: assertTrue("Result did not contain D.class", files
071: .containsKey("D.class"));
072: }
073:
074: /**
075: * Test that inner class dependencies trigger deletion of the outer class
076: */
077: public void testInner() {
078: executeTarget("testinner");
079: assertEquals("Depend did not leave correct number of files", 0,
080: getResultFiles().size());
081: }
082:
083: /**
084: * Test that multi-leve inner class dependencies trigger deletion of
085: * the outer class
086: */
087: public void testInnerInner() {
088: executeTarget("testinnerinner");
089: assertEquals("Depend did not leave correct number of files", 0,
090: getResultFiles().size());
091: }
092:
093: /**
094: * Test that an exception is thrown when there is no source
095: */
096: public void testNoSource() {
097: expectBuildExceptionContaining("testnosource",
098: "No source specified", "srcdir attribute must be set");
099: }
100:
101: /**
102: * Test that an exception is thrown when the source attribute is empty
103: */
104: public void testEmptySource() {
105: expectBuildExceptionContaining("testemptysource",
106: "No source specified",
107: "srcdir attribute must be non-empty");
108: }
109:
110: /**
111: * Read the result fileset into a Hashtable
112: *
113: * @return a Hashtable containing the names of the files in the result
114: * fileset
115: */
116: private Hashtable getResultFiles() {
117: FileSet resultFileSet = (FileSet) project
118: .getReference(RESULT_FILESET);
119: DirectoryScanner scanner = resultFileSet
120: .getDirectoryScanner(project);
121: String[] scannedFiles = scanner.getIncludedFiles();
122: Hashtable files = new Hashtable();
123: for (int i = 0; i < scannedFiles.length; ++i) {
124: files.put(scannedFiles[i], scannedFiles[i]);
125: }
126: return files;
127: }
128:
129: /**
130: * Test mutual dependency between inner and outer do not cause both to be
131: * deleted
132: */
133: public void testInnerClosure() {
134: executeTarget("testinnerclosure");
135: assertEquals("Depend did not leave correct number of files", 4,
136: getResultFiles().size());
137: }
138:
139: /**
140: * Test the operation of the cache
141: */
142: public void testCache() {
143: executeTarget("testcache");
144: }
145:
146: /**
147: * Test the detection and warning of non public classes
148: */
149: public void testNonPublic() {
150: executeTarget("testnonpublic");
151: String log = getLog();
152: assertTrue("Expected warning about APrivate", log
153: .indexOf("The class APrivate in file") != -1);
154: assertTrue("but has not been deleted because its source file "
155: + "could not be determined", log
156: .indexOf("The class APrivate in file") != -1);
157: }
158:
159: }
|