package com.xenoage.zong.view; import static com.xenoage.utils.math.geom.Point2f.p; import static com.xenoage.zong.layout.LayoutPos.layoutPos; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import org.junit.Before; import org.junit.Test; import com.xenoage.utils.math.Delta; import com.xenoage.utils.math.Units; import com.xenoage.utils.math.geom.Point2f; import com.xenoage.utils.math.geom.Point2i; import com.xenoage.utils.math.geom.Size2f; import com.xenoage.utils.math.geom.Size2i; import com.xenoage.zong.core.format.PageFormat; import com.xenoage.zong.core.format.PageMargins; import com.xenoage.zong.layout.Layout; import com.xenoage.zong.layout.Page; import com.xenoage.zong.view.PageViewManager.PageDisplayAlignment; /** * Tests for {@link PageViewManager}. * * @author Andreas Wenger */ public class PageViewManagerTest { private PageViewManager view; @Before public void setUp() { Layout layout = new Layout(null); //3 pages: // ---- -------- // |1 | -2------ |3 | // | | -------- | | // ---- -------- layout.addPage(new Page(new PageFormat(new Size2f(100, 200), new PageMargins(0, 0, 0, 0)))); layout.addPage(new Page(new PageFormat(new Size2f(200, 100), new PageMargins(0, 0, 0, 0)))); layout.addPage(new Page(new PageFormat(new Size2f(200, 200), new PageMargins(0, 0, 0, 0)))); //create view view = new PageViewManager(layout); view.setPageDisplayAlignment(PageDisplayAlignment.Horizontal); } @Test public void getPageDisplayOffset() { float distance = view.pageDisplayDistance; float d = Delta.DELTA_FLOAT; //page 1 Point2f p = view.getPageDisplayOffset(0); assertEquals(-100 / 2, p.x, d); assertEquals(-200 / 2, p.y, d); //page 2 p = view.getPageDisplayOffset(1); assertEquals(100 / 2 + distance, p.x, d); assertEquals(-100 / 2, p.y, d); //page 3 p = view.getPageDisplayOffset(2); assertEquals(100 / 2 + distance + 200 + distance, p.x, d); assertEquals(-200 / 2, p.y, d); } @Test public void getPageIndex() { float distance = view.pageDisplayDistance; //point -100/0 belongs to page 0 assertEquals(0, view.getNearestPageIndex(new Point2f(-100, 0))); //point 50/0 still belongs to page 0 assertEquals(0, view.getNearestPageIndex(new Point2f(50, 0))); //point 50+distance+10/0 belongs to page 1 assertEquals(1, view.getNearestPageIndex(new Point2f(50 + distance + 10, 0))); //point 1000/0 belongs to page 2 assertEquals(2, view.getNearestPageIndex(new Point2f(1000, 0))); } @Test public void computeLayoutPosition() { Size2i viewSize = new Size2i(800, 600); float viewScaling = 1; Point2f viewScroll = new Point2f(0, 0); ViewState viewState = new ViewState(viewSize, viewScaling, viewScroll); //default zoom and scroll: point 400/300 must //have center position of the page (50/100) Point2f pos = view.computeLP(new Point2i(400, 300), viewState).position; assertEquals(pos.x, 50, Delta.DELTA_FLOAT); assertEquals(pos.y, 100, Delta.DELTA_FLOAT); //set zoom to 200%, must still be 50/100 viewScaling = 2; viewState = new ViewState(viewSize, viewScaling, viewScroll); pos = view.computeLP(new Point2i(400, 300), viewState).position; assertEquals(pos.x, 50, Delta.DELTA_FLOAT); assertEquals(pos.y, 100, Delta.DELTA_FLOAT); //scroll to -5/10 //screen point 400/300 must be 45/110 viewScroll = new Point2f(-5, 10); viewState = new ViewState(viewSize, viewScaling, viewScroll); pos = view.computeLP(new Point2i(400, 300), viewState).position; assertEquals(pos.x, 45, Delta.DELTA_FLOAT); assertEquals(pos.y, 110, Delta.DELTA_FLOAT); //screen point 0/0 must be //50+(-5-400*pxToMm/zoom);100+(10-300*pxToMm/zoom) //compute relative to page 0, since coordinates are outside pos = view.computeLP(new Point2i(0, 0), 0, viewState).position; assertEquals(pos.x, 50 + -5 - Units.pxToMm(400, viewScaling), Delta.DELTA_FLOAT); assertEquals(pos.y, 100 + 10 - Units.pxToMm(300, viewScaling), Delta.DELTA_FLOAT); //when not computed relative to a given page, it must return null assertNull(view.computeLP(new Point2i(0, 0), viewState)); //reset zoom/scroll, then screen point 800/300 must be on page 1 viewScaling = 1; viewScroll = new Point2f(0, 0); viewState = new ViewState(viewSize, viewScaling, viewScroll); int pageIndex = view.computeLP(new Point2i(800, 300), viewState).pageIndex; assertEquals(1, pageIndex); } @Test public void computeScreenPosition() { Size2i viewSize = new Size2i(800, 600); float viewScaling = 1; Point2f viewScroll = new Point2f(0, 0); ViewState viewState = new ViewState(viewSize, viewScaling, viewScroll); //center point of the page must have screen coordinates 400/300 Point2i pos = view.computePositionPx(layoutPos(null, 0, p(50, 100)), viewState); assertEquals(pos.x, 400); assertEquals(pos.y, 300); //set zoom to 200%, must still be 400/300 viewScaling = 2; viewState = new ViewState(viewSize, viewScaling, viewScroll); pos = view.computePositionPx(layoutPos(null, 0, p(50, 100)), viewState); assertEquals(pos.x, 400); assertEquals(pos.y, 300); //scroll to -5/10 //page point 45/110 must be 400/300 viewScroll = new Point2f(-5, 10); viewState = new ViewState(viewSize, viewScaling, viewScroll); pos = view.computePositionPx(layoutPos(null, 0, p(45, 110)), viewState); assertEquals(pos.x, 400); assertEquals(pos.y, 300); //page center point must be //400-(-5*MmToPx*zoom); 300-(10*MmToPx*zoom) pos = view.computePositionPx(layoutPos(null, 0, p(50, 100)), viewState); assertEquals(pos.x, Math.round(400 - Units.mmToPx(-5, viewScaling))); assertEquals(pos.y, Math.round(300 - Units.mmToPx(10, viewScaling))); } }