package nl.tudelft.lifetiles.graph.view; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.logging.Level; import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.event.Event; import javafx.scene.Group; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; import javafx.scene.shape.Circle; import nl.tudelft.lifetiles.annotation.model.KnownMutation; import nl.tudelft.lifetiles.annotation.model.KnownMutationMapper; import nl.tudelft.lifetiles.annotation.model.KnownMutationParser; import nl.tudelft.lifetiles.core.util.Logging; import nl.tudelft.lifetiles.core.util.Settings; import nl.tudelft.lifetiles.graph.controller.GraphController; import nl.tudelft.lifetiles.graph.model.BucketCache; import nl.tudelft.lifetiles.graph.model.FactoryProducer; import nl.tudelft.lifetiles.graph.model.Graph; import nl.tudelft.lifetiles.graph.model.GraphFactory; import nl.tudelft.lifetiles.sequence.Mutation; import nl.tudelft.lifetiles.sequence.model.DefaultSequence; import nl.tudelft.lifetiles.sequence.model.SegmentEmpty; import nl.tudelft.lifetiles.sequence.model.Sequence; import nl.tudelft.lifetiles.sequence.model.SequenceSegment; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class TileViewTest { @Mock GraphController controller; Sequence s1, s2, s3, s4; TileView tileview; Graph<SequenceSegment> gr; BucketCache buckets; private Circle bookmark; // its used inside a lambda. does not seem to be recognized as such @SuppressWarnings("unused") private VertexView vertexView1; /** * Final string for radius settings property. */ private static final String RADIUS_SETTING = "bookmark_radius"; @BeforeClass public static void before() { Logging.setLevel(Level.SEVERE); } @Before public void setUp() { controller = Mockito.mock(GraphController.class); tileview = new TileView(controller, 200); s1 = new DefaultSequence("TKK-REF"); s2 = new DefaultSequence("Not TKK-REF"); s3 = new DefaultSequence("Imposter"); s4 = new DefaultSequence("4Zftr3H"); } @Test public void drawGraphVerticesDrawGenericTest() { creategraph(); buckets = new BucketCache(1, gr); Group result = tileview.drawGraph(buckets.getSegments(0, 1), gr, null, null, 1); assertEquals(4, ((Group) result.getChildrenUnmodifiable().get(0)) .getChildrenUnmodifiable().size()); } // @Test TODO integrate this in the edge drawing settings public void drawGraphEdgesDrawGenericTest() { creategraph(); buckets = new BucketCache(1, gr); Group result = tileview.drawGraph(buckets.getSegments(0, 0), gr, null, null, 1); assertEquals(3, ((Group) result.getChildrenUnmodifiable().get(1)) .getChildrenUnmodifiable().size()); } @Test public void drawVerticeTest() { GraphFactory<SequenceSegment> gf = FactoryProducer .getFactory("JGraphT"); Graph<SequenceSegment> graph; SequenceSegment v1; v1 = new SequenceSegment(new HashSet<Sequence>(Arrays.asList(s1, s2)), 5, 7, new SegmentEmpty(2)); v1.setUnifiedStart(0); v1.setUnifiedEnd(2); graph = gf.getGraph(); graph.addVertex(v1); BucketCache buckets = new BucketCache(1, graph); Group result = tileview.drawGraph(buckets.getSegments(0, 1), gr, null, null, 1); VertexView vView1 = (VertexView) ((Group) result .getChildrenUnmodifiable().get(0)).getChildrenUnmodifiable() .get(0); assertEquals(0, vView1.getLayoutX(), 1e-10); assertEquals(200, vView1.getLayoutY(), 1e-10); assertEquals(200 - 2, vView1.getBoundsInParent().getHeight(), 1e-10); assertEquals(2 * 11 - 2, vView1.getBoundsInParent().getWidth(), 1e-10); } @Test public void drawAnnotationTest() throws IOException, InterruptedException { GraphFactory<SequenceSegment> gf = FactoryProducer .getFactory("JGraphT"); Graph<SequenceSegment> graph; SequenceSegment v1; v1 = new SequenceSegment(new HashSet<Sequence>(Arrays.asList(s1, s2)), 0, 20, new SegmentEmpty(20)); v1.setUnifiedStart(0); v1.setUnifiedEnd(20); graph = gf.getGraph(); graph.addVertex(v1); BucketCache buckets = new BucketCache(1, graph); File file = new File( "./src/test/resources/data/test_annotations/simple_known_mutations.txt"); List<KnownMutation> parse = KnownMutationParser .parseKnownMutations(file); Sequence reference = graph.getSources().iterator().next().getSources() .iterator().next(); Map<SequenceSegment, List<KnownMutation>> annotations = KnownMutationMapper .mapAnnotations(graph, parse, reference); // Hack so you make a tooltip, javafx toolkit need to be initialised for // that JFXPanel panel = new JFXPanel(); panel.contains(0, 0); Platform.runLater(() -> { Group result = tileview.drawGraph(buckets.getSegments(0, 1), graph, annotations, null, 1); bookmark = (Circle) ((Group) result.getChildrenUnmodifiable() .get(2)).getChildrenUnmodifiable().get(0); vertexView1 = (VertexView) ((Group) result .getChildrenUnmodifiable().get(0)) .getChildrenUnmodifiable().get(0); }); Thread.sleep(1000); assertEquals(bookmark.getRadius(), Double.parseDouble(Settings .get(RADIUS_SETTING)), 1e-10); } @Test public void clickVertexTest() { creategraph(); buckets = new BucketCache(1, gr); Group result = tileview.drawGraph(buckets.getSegments(0, 1), gr, null, null, 1); Event.fireEvent(((Group) result.getChildrenUnmodifiable().get(0)) .getChildrenUnmodifiable().get(0), new MouseEvent( MouseEvent.MOUSE_CLICKED, 0, 0, 0, 0, MouseButton.PRIMARY, 1, true, true, true, true, true, true, true, true, true, true, null)); Mockito.verify(controller).clicked(Mockito.any()); } private void creategraph() { GraphFactory<SequenceSegment> gf = FactoryProducer .getFactory("JGraphT"); SequenceSegment v1, v2, v3, v4; v1 = new SequenceSegment(new HashSet<Sequence>(Arrays.asList(s1, s2)), 5, 7, new SegmentEmpty(2)); v2 = new SequenceSegment(new HashSet<Sequence>(Arrays.asList(s1, s2)), 7, 9, new SegmentEmpty(2)); v3 = new SequenceSegment(new HashSet<Sequence>(Arrays.asList(s1, s2)), 0, 2, new SegmentEmpty(2)); v4 = new SequenceSegment(new HashSet<Sequence>(Arrays.asList(s1, s2)), 2, 5, new SegmentEmpty(2)); v1.setUnifiedStart(0); v1.setUnifiedEnd(2); v2.setUnifiedStart(2); v2.setUnifiedEnd(5); v3.setUnifiedStart(5); v3.setUnifiedEnd(7); v4.setUnifiedStart(7); v4.setUnifiedEnd(9); v2.setMutation(Mutation.DELETION); gr = gf.getGraph(); gr.addVertex(v1); gr.addVertex(v2); gr.addVertex(v3); gr.addVertex(v4); gr.addEdge(v1, v2); gr.addEdge(v2, v3); gr.addEdge(v3, v4); } }