package org.vorthmann.zome.app.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.StringTokenizer; import org.junit.Test; import org.vorthmann.ui.Controller; import com.vzome.core.algebra.AlgebraicField; import com.vzome.core.algebra.AlgebraicNumber; import com.vzome.core.algebra.PentagonField; public class LengthControllerTest { private void assertStateAfter( Controller controller, String[] actions, String[] propertyValues ) { if ( actions != null ) try { for ( String actionOrChange : actions ) { if ( actionOrChange .contains( "=" ) ) { StringTokenizer tokens = new StringTokenizer( actionOrChange, "=" ); String name = tokens .nextToken(); String value = tokens .nextToken(); controller .setProperty( name, value ); } else controller .doAction( actionOrChange, null ); } } catch (Exception e) { fail( e .getMessage() ); } String[] properties = new String[]{ "half", "scale", "unitText", "unitIsCustom", "lengthText" }; for ( int i = 0; i < properties.length; i++ ) { String actual = controller .getProperty( properties[ i ] ); String expected = propertyValues[ i ]; assertEquals( expected, actual ); } } private void assertStateAfter( LengthController controller, String[] actions, String[] propertyValues, AlgebraicNumber expectedValue ) { assertStateAfter( controller, actions, propertyValues ); AlgebraicNumber result = controller .getValue(); assertEquals( expectedValue, result ); } @Test public void testInitialState() { AlgebraicField field = new PentagonField(); LengthController controller = new LengthController( field ); assertStateAfter( controller, null, new String[]{ "false", "0", "1", "false", "1" }, field .createAlgebraicNumber( 1, 0, 1, 3 ) ); } @Test public void testSetHalf() { AlgebraicField field = new PentagonField(); LengthController controller = new LengthController( field ); assertStateAfter( controller, new String[]{ "half=true" }, new String[]{ "true", "0", "1", "false", "1" }, field .createAlgebraicNumber( 1, 0, 2, 3 ) ); } @Test public void testToggleHalf() { AlgebraicField field = new PentagonField(); LengthController controller = new LengthController( field ); assertStateAfter( controller, new String[]{ "half=true, toggleHalf" }, new String[]{ "false", "0", "1", "false", "1" }, field .createAlgebraicNumber( 1, 0, 1, 3 ) ); } @Test public void testSetScale() { AlgebraicField field = new PentagonField(); LengthController controller = new LengthController( field ); assertStateAfter( controller, new String[]{ "scale=5" }, new String[]{ "false", "5", "1", "false", "3 +5\u03C6" }, field .createAlgebraicNumber( 1, 0, 1, 8 ) ); } @Test public void testGetCustomUnit() { AlgebraicField field = new PentagonField(); LengthController controller = new LengthController( field ); Controller units = controller .getSubController( "unit" ); units .setProperty( "values", "5 8 3" ); assertStateAfter( controller, new String[]{ "getCustomUnit" }, new String[]{ "false", "0", "5/3 +8/3\u03C6", "true", "5/3 +8/3\u03C6" }, field .createAlgebraicNumber( 5, 8, 3, 3 ) ); } @Test public void testLong() { AlgebraicField field = new PentagonField(); LengthController controller = new LengthController( field ); assertStateAfter( controller, new String[]{ "long" }, new String[]{ "false", "2", "1", "false", "1 +\u03C6" }, field .createAlgebraicNumber( 1, 0, 1, 5 ) ); } @Test public void testScaling() { AlgebraicField field = new PentagonField(); LengthController controller = new LengthController( field ); assertStateAfter( controller, new String[]{ "long", "scaleDown", "scaleDown", "scaleDown" }, new String[]{ "false", "-1", "1", "false", "-1 +\u03C6" }, field .createPower( 2 ) ); } @Test public void testNewZeroScale() { AlgebraicField field = new PentagonField(); LengthController controller = new LengthController( field ); Controller units = controller .getSubController( "unit" ); units .setProperty( "values", "3 0 1" ); assertStateAfter( controller, new String[]{ "getCustomUnit", "scaleUp", "scaleUp", "newZeroScale" }, new String[]{ "false", "0", "3 +3\u03C6", "true", "3 +3\u03C6" }, field .createAlgebraicNumber( 3, 0, 1, 5 ) ); } @Test public void testReset() { AlgebraicField field = new PentagonField(); LengthController controller = new LengthController( field ); Controller units = controller .getSubController( "unit" ); units .setProperty( "values", "5 2 7" ); assertStateAfter( controller, new String[]{ "getCustomUnit", "scaleUp", "newZeroScale", "reset" }, new String[]{ "false", "0", "1", "false", "1" }, field .createAlgebraicNumber( 1, 0, 1, 3 ) ); } }