3737import java .io .IOException ;
3838import java .util .ArrayList ;
3939import java .util .Arrays ;
40+ import java .util .Collections ;
4041import java .util .List ;
4142
4243import javax .script .ScriptEngine ;
4546import org .junit .BeforeClass ;
4647import org .junit .Test ;
4748import org .scijava .Context ;
49+ import org .scijava .MenuPath ;
4850import org .scijava .plugin .Plugin ;
4951import org .scijava .test .TestUtils ;
52+ import org .scijava .util .AppUtils ;
5053import org .scijava .util .FileUtils ;
5154
5255/**
@@ -64,10 +67,10 @@ public class ScriptFinderTest {
6467 public static void setUp () throws IOException {
6568 scriptsDir = TestUtils .createTemporaryDirectory ("script-finder-" );
6669 TestUtils .createPath (scriptsDir , "ignored.foo" );
67- TestUtils .createPath (scriptsDir , "Plugins /quick.foo" );
68- TestUtils .createPath (scriptsDir , "Plugins /brown.foo" );
69- TestUtils .createPath (scriptsDir , "Plugins /fox.foo" );
70- TestUtils .createPath (scriptsDir , "Plugins /The_Lazy_Dog.foo" );
70+ TestUtils .createPath (scriptsDir , "Scripts /quick.foo" );
71+ TestUtils .createPath (scriptsDir , "Scripts /brown.foo" );
72+ TestUtils .createPath (scriptsDir , "Scripts /fox.foo" );
73+ TestUtils .createPath (scriptsDir , "Scripts /The_Lazy_Dog.foo" );
7174 TestUtils .createPath (scriptsDir , "Math/add.foo" );
7275 TestUtils .createPath (scriptsDir , "Math/subtract.foo" );
7376 TestUtils .createPath (scriptsDir , "Math/multiply.foo" );
@@ -86,30 +89,105 @@ public static void tearDown() {
8689
8790 @ Test
8891 public void testFindScripts () {
89- final Context context = new Context (ScriptService .class );
90- final ScriptService scriptService = context .service (ScriptService .class );
92+ final ScriptService scriptService = createScriptService ();
9193 scriptService .addScriptDirectory (scriptsDir );
9294
93- final ScriptFinder scriptFinder = new ScriptFinder (scriptService );
95+ final ArrayList < ScriptInfo > scripts = findScripts (scriptService );
9496
95- final ArrayList <ScriptInfo > scripts = new ArrayList <ScriptInfo >();
96- scriptFinder .findScripts (scripts );
9797 assertEquals (11 , scripts .size ());
98- assertMenuPath ("Math > add" , scripts , 0 );
99- assertMenuPath ("Math > divide" , scripts , 1 );
100- assertMenuPath ("Math > multiply" , scripts , 2 );
101- assertMenuPath ("Math > subtract" , scripts , 3 );
102- assertMenuPath ("Math > Trig > cos" , scripts , 4 );
103- assertMenuPath ("Math > Trig > sin" , scripts , 5 );
104- assertMenuPath ("Math > Trig > tan" , scripts , 6 );
105- assertMenuPath ("Plugins > brown" , scripts , 7 );
106- assertMenuPath ("Plugins > fox" , scripts , 8 );
107- assertMenuPath ("Plugins > quick" , scripts , 9 );
108- assertMenuPath ("Plugins > The Lazy Dog" , scripts , 10 );
98+ assertMenuPath ("Scripts > The Lazy Dog" , scripts , 0 );
99+ assertMenuPath ("Math > add" , scripts , 1 );
100+ assertMenuPath ("Scripts > brown" , scripts , 2 );
101+ assertMenuPath ("Math > Trig > cos" , scripts , 3 );
102+ assertMenuPath ("Math > divide" , scripts , 4 );
103+ assertMenuPath ("Scripts > fox" , scripts , 5 );
104+ assertMenuPath ("Math > multiply" , scripts , 6 );
105+ assertMenuPath ("Scripts > quick" , scripts , 7 );
106+ assertMenuPath ("Math > Trig > sin" , scripts , 8 );
107+ assertMenuPath ("Math > subtract" , scripts , 9 );
108+ assertMenuPath ("Math > Trig > tan" , scripts , 10 );
109+ }
110+
111+ /**
112+ * Tests that menu prefixes work as expected when
113+ * {@link ScriptService#addScriptDirectory(File, org.scijava.MenuPath)} is
114+ * called.
115+ */
116+ @ Test
117+ public void testMenuPrefixes () {
118+ final ScriptService scriptService = createScriptService ();
119+
120+ final MenuPath menuPrefix = new MenuPath ("Foo > Bar" );
121+ assertEquals (2 , menuPrefix .size ());
122+ assertEquals ("Bar" , menuPrefix .getLeaf ().getName ());
123+ scriptService .addScriptDirectory (scriptsDir , menuPrefix );
124+
125+ final ArrayList <ScriptInfo > scripts = findScripts (scriptService );
126+
127+ assertEquals (12 , scripts .size ());
128+ assertMenuPath ("Foo > Bar > Scripts > The Lazy Dog" , scripts , 0 );
129+ assertMenuPath ("Foo > Bar > Math > add" , scripts , 1 );
130+ assertMenuPath ("Foo > Bar > Scripts > brown" , scripts , 2 );
131+ assertMenuPath ("Foo > Bar > Math > Trig > cos" , scripts , 3 );
132+ assertMenuPath ("Foo > Bar > Math > divide" , scripts , 4 );
133+ assertMenuPath ("Foo > Bar > Scripts > fox" , scripts , 5 );
134+ assertMenuPath ("Foo > Bar > ignored" , scripts , 6 );
135+ assertMenuPath ("Foo > Bar > Math > multiply" , scripts , 7 );
136+ assertMenuPath ("Foo > Bar > Scripts > quick" , scripts , 8 );
137+ assertMenuPath ("Foo > Bar > Math > Trig > sin" , scripts , 9 );
138+ assertMenuPath ("Foo > Bar > Math > subtract" , scripts , 10 );
139+ assertMenuPath ("Foo > Bar > Math > Trig > tan" , scripts , 11 );
140+ }
141+
142+ /**
143+ * Tests that scripts are discovered only once when present in multiple base
144+ * directories.
145+ */
146+ @ Test
147+ public void testOverlappingDirectories () {
148+ final ScriptService scriptService = createScriptService ();
149+
150+ // Scripts -> Plugins
151+ scriptService .addScriptDirectory (new File (scriptsDir , "Scripts" ),
152+ new MenuPath ("Plugins" ));
153+ // everything else "in place"
154+ scriptService .addScriptDirectory (scriptsDir );
155+
156+ final ArrayList <ScriptInfo > scripts = findScripts (scriptService );
157+
158+ assertEquals (11 , scripts .size ());
159+ assertMenuPath ("Plugins > The Lazy Dog" , scripts , 0 );
160+ assertMenuPath ("Math > add" , scripts , 1 );
161+ assertMenuPath ("Plugins > brown" , scripts , 2 );
162+ assertMenuPath ("Math > Trig > cos" , scripts , 3 );
163+ assertMenuPath ("Math > divide" , scripts , 4 );
164+ assertMenuPath ("Plugins > fox" , scripts , 5 );
165+ assertMenuPath ("Math > multiply" , scripts , 6 );
166+ assertMenuPath ("Plugins > quick" , scripts , 7 );
167+ assertMenuPath ("Math > Trig > sin" , scripts , 8 );
168+ assertMenuPath ("Math > subtract" , scripts , 9 );
169+ assertMenuPath ("Math > Trig > tan" , scripts , 10 );
109170 }
110171
111172 // -- Helper methods --
112173
174+ private ScriptService createScriptService () {
175+ final Context context = new Context (ScriptService .class );
176+ final ScriptService scriptService = context .service (ScriptService .class );
177+ final File defaultScriptsDir =
178+ new File (AppUtils .getBaseDirectory (ScriptFinder .class ), "scripts" );
179+ scriptService .removeScriptDirectory (defaultScriptsDir );
180+ return scriptService ;
181+ }
182+
183+ private ArrayList <ScriptInfo > findScripts (final ScriptService scriptService ) {
184+ final ScriptFinder scriptFinder = new ScriptFinder (scriptService );
185+ final ArrayList <ScriptInfo > scripts = new ArrayList <ScriptInfo >();
186+ scriptFinder .findScripts (scripts );
187+ Collections .sort (scripts );
188+ return scripts ;
189+ }
190+
113191 private void assertMenuPath (final String menuString ,
114192 final ArrayList <ScriptInfo > scripts , final int i )
115193 {
0 commit comments