package ast.representation;

import junit.framework.*;
import junit.textui.*;

/** Test Sequence subclasses.
 * @author Gary T. Leavens
 */
public class TestSequence extends TestCase
{

    /** Initialize this test driver class. */
    public TestSequence(String name) {
        super(name);
    }

    /** Run the tests. */
    public static void main(String[] args) {
        junit.textui.TestRunner.run(suite());
    }

    /** Returns the test suite for this test class. */
    public static junit.framework.Test suite() {
        return new junit.framework.TestSuite(TestSequence.class);
    }

    double delta = 1.0e-10;

    /** Test SequenceRepeat. */
    public void testSeqenceRepeat() {
        assertEquals(1.0, new SequenceRepeat(1.0).getNth(24567), delta);
        assertEquals(-5.3, new SequenceRepeat(-5.3).getNth(0), delta);
    }

    /** Test SequenceGenerator. */
    public void testSequenceGenerator() {
        assertEquals(0.25,  // = 1/4
                     new SequenceGenerator(new StrategyHalf())
                     .getNth(2),
                     delta);
        assertEquals(0.125,  // = 1/8
                     new SequenceGenerator(new StrategyHalf())
                     .getNth(3),
                     delta);
        assertEquals(1.0/Math.pow(2.0,342.0), 
                     new SequenceGenerator(new StrategyHalf())
                     .getNth(342),
                     delta);
        assertEquals(4.0,
                     new SequenceGenerator(new Strategy() {
                             public double apply(long i) { return i + 1.0; }
                         })
                     .getNth(3),
                     delta);
    }

    /** Test SequenceAdd. */
    public void testSequenceAdd() {
        assertEquals(1.25,  // = 1 + 1/4
                     new SequenceAdd(new SequenceRepeat(1.0),
                                     new SequenceGenerator(new StrategyHalf()))
                     .getNth(2),
                     delta);
        assertEquals(1.125,  // = 1 + 1/8
                     new SequenceAdd(new SequenceRepeat(1.0),
                                     new SequenceGenerator(new StrategyHalf()))
                     .getNth(3),
                     delta);
        assertEquals(1.0, // close enough... :-)
                     new SequenceAdd(new SequenceRepeat(1.0),
                                     new SequenceGenerator(new StrategyHalf()))
                     .getNth(342),
                     delta);
    }

    
}
