blob: d71964a4edfd0cb6e6fffa6db30472681e33c643 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.myfaces.tobago.internal.config;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.List;
public class TobagoConfigSorterUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@Test
public void testCompare() {
// config + names
final TobagoConfigFragment a = new TobagoConfigFragment();
a.setName("a");
final TobagoConfigFragment b = new TobagoConfigFragment();
b.setName("b");
final TobagoConfigFragment c = new TobagoConfigFragment();
c.setName("c");
final TobagoConfigFragment d = new TobagoConfigFragment();
d.setName("d");
final TobagoConfigFragment e = new TobagoConfigFragment();
e.setName("e");
final TobagoConfigFragment f = new TobagoConfigFragment();
f.setName("f");
final TobagoConfigFragment m = new TobagoConfigFragment();
m.setName("m");
final TobagoConfigFragment n = new TobagoConfigFragment();
n.setName("n");
// unnamed
final TobagoConfigFragment u1 = new TobagoConfigFragment();
final TobagoConfigFragment u2 = new TobagoConfigFragment();
final TobagoConfigFragment u3 = new TobagoConfigFragment();
// before
a.getBefore().add("b");
b.getBefore().add("c");
u1.getBefore().add("d");
u2.getBefore().add("d");
u2.getBefore().add("y"); // not relevant
// after
e.getAfter().add("d");
f.getAfter().add("e");
u1.getAfter().add("c");
u2.getAfter().add("c");
u2.getAfter().add("z"); // not relevant
n.getAfter().add("m");
final List<TobagoConfigFragment> list = new ArrayList<>();
list.add(a);
list.add(b);
list.add(c);
list.add(d);
list.add(e);
list.add(f);
list.add(u1);
list.add(u2);
list.add(u3);
list.add(m);
list.add(n);
final TobagoConfigSorter sorter = new TobagoConfigSorter(list);
final List<TobagoConfigFragment> result = sorter.topologicalSort();
Assertions.assertEquals(a, result.get(0));
Assertions.assertEquals(b, result.get(1));
Assertions.assertEquals(c, result.get(2));
Assertions.assertEquals(u1, result.get(3));
Assertions.assertEquals(u2, result.get(4));
Assertions.assertEquals(d, result.get(5));
Assertions.assertEquals(e, result.get(6));
Assertions.assertEquals(f, result.get(7));
Assertions.assertEquals(u3, result.get(8));
Assertions.assertEquals(m, result.get(9));
Assertions.assertEquals(n, result.get(10));
}
@Test
public void test0() {
// config + names
final List<TobagoConfigFragment> list = new ArrayList<>();
final TobagoConfigSorter sorter = new TobagoConfigSorter(list);
final List<TobagoConfigFragment> result = sorter.topologicalSort();
Assertions.assertTrue(result.isEmpty());
}
@Test
public void testCycle1Before() {
// config + names
final TobagoConfigFragment a = new TobagoConfigFragment();
a.setName("a");
a.getBefore().add("a");
final List<TobagoConfigFragment> list = new ArrayList<>();
list.add(a);
final TobagoConfigSorter sorter = new TobagoConfigSorter(list);
try {
sorter.topologicalSort();
Assertions.fail("Cycle was not detected!");
} catch (final RuntimeException e) {
LOG.info("Success: Cycle found: {}", e.getMessage());
}
}
@Test
public void testCycle1After() {
// config + names
final TobagoConfigFragment a = new TobagoConfigFragment();
a.setName("a");
a.getAfter().add("a");
final List<TobagoConfigFragment> list = new ArrayList<>();
list.add(a);
final TobagoConfigSorter sorter = new TobagoConfigSorter(list);
try {
sorter.topologicalSort();
Assertions.fail("Cycle was not detected!");
} catch (final RuntimeException e) {
LOG.info("Success: Cycle found: {}", e.getMessage());
}
}
@Test
public void testCycle2() {
// config + names
final TobagoConfigFragment a = new TobagoConfigFragment();
a.setName("a");
final TobagoConfigFragment b = new TobagoConfigFragment();
b.setName("b");
// before
a.getBefore().add("b");
b.getBefore().add("a");
final List<TobagoConfigFragment> list = new ArrayList<>();
list.add(a);
list.add(b);
final TobagoConfigSorter sorter = new TobagoConfigSorter(list);
try {
sorter.topologicalSort();
Assertions.fail("Cycle was not detected!");
} catch (final RuntimeException e) {
LOG.info("Success: Cycle found: {}", e.getMessage());
}
}
@Test
public void testCycle2BeforeAfter() {
// config + names
final TobagoConfigFragment a = new TobagoConfigFragment();
a.setName("a");
final TobagoConfigFragment b = new TobagoConfigFragment();
b.setName("b");
// before
a.getBefore().add("b");
// after
a.getAfter().add("b");
final List<TobagoConfigFragment> list = new ArrayList<>();
list.add(a);
list.add(b);
final TobagoConfigSorter sorter = new TobagoConfigSorter(list);
try {
sorter.topologicalSort();
Assertions.fail("Cycle was not detected!");
} catch (final RuntimeException e) {
LOG.info("Success: Cycle found: {}", e.getMessage());
}
}
@Test
public void testCycle3() {
// config + names
final TobagoConfigFragment a = new TobagoConfigFragment();
a.setName("a");
final TobagoConfigFragment b = new TobagoConfigFragment();
b.setName("b");
final TobagoConfigFragment c = new TobagoConfigFragment();
c.setName("c");
// before
a.getBefore().add("b");
b.getBefore().add("c");
a.getAfter().add("c");
final List<TobagoConfigFragment> list = new ArrayList<>();
list.add(a);
list.add(b);
list.add(c);
final TobagoConfigSorter sorter = new TobagoConfigSorter(list);
try {
sorter.topologicalSort();
Assertions.fail("Cycle was not detected!");
} catch (final RuntimeException e) {
LOG.info("Success: Cycle found: {}", e.getMessage());
}
}
@Test
public void testReal() {
// config + names
final TobagoConfigFragment blank = new TobagoConfigFragment();
blank.setName("tobago-example-blank");
final TobagoConfigFragment charlotteville = new TobagoConfigFragment();
charlotteville.setName("tobago-theme-charlotteville");
final TobagoConfigFragment roxborough = new TobagoConfigFragment();
roxborough.setName("tobago-theme-roxborough");
final TobagoConfigFragment scarborough = new TobagoConfigFragment();
scarborough.setName("tobago-theme-scarborough");
final TobagoConfigFragment speyside = new TobagoConfigFragment();
speyside.setName("tobago-theme-speyside");
final TobagoConfigFragment standard = new TobagoConfigFragment();
standard.setName("tobago-theme-standard");
final TobagoConfigFragment core = new TobagoConfigFragment();
core.setName("tobago-core");
// after
blank.getAfter().add(speyside.getName());
blank.getAfter().add(scarborough.getName());
blank.getAfter().add(roxborough.getName());
blank.getAfter().add(standard.getName());
blank.getAfter().add(charlotteville.getName());
charlotteville.getAfter().add(standard.getName());
roxborough.getAfter().add(standard.getName());
scarborough.getAfter().add(standard.getName());
speyside.getAfter().add(standard.getName());
standard.getAfter().add(core.getName());
final List<TobagoConfigFragment> list = new ArrayList<>();
list.add(blank);
list.add(charlotteville);
list.add(roxborough);
list.add(scarborough);
list.add(speyside);
list.add(standard);
list.add(core);
final TobagoConfigSorter sorter = new TobagoConfigSorter(list);
final List<TobagoConfigFragment> result = sorter.topologicalSort();
Assertions.assertEquals(core, result.get(0));
Assertions.assertEquals(standard, result.get(1));
Assertions.assertEquals(blank, result.get(6));
final int blankPos = result.indexOf(blank);
final int speysidePos = result.indexOf(speyside);
Assertions.assertTrue(blankPos > speysidePos);
}
}