// Path: src/filter/InterpolatingArray.java
// public abstract class InterpolatingArray {
// 
//     protected final double[] points;
// 
//     public abstract double get(double x);
//     
//     public abstract double get(int i);
// 
//     protected int order = 2;
//     
//     public InterpolatingArray(double[] points, int order) {
//         this(points);
//         this.order = order;
//     }
// 
//     public InterpolatingArray(double[] points) {
//         this.points = points;
//     }
//     
//     public double[] getShiftedArray(double shift) { 
//     	int length = points.length;
//     	double[] result = new double[length]; 
//     	for (int i = 0; i < length; i++) { 
//     		result[i] = get(i+shift); 
//     	}
//     	return result;
//     }
// 
//     public final int length() { 
//     	return points.length;  
//     }
//     
//     public interface Factory {
//         InterpolatingArray getInstance(double[] points); 
//     }
// 
// }
// 
// Path: src/filter/SincRepeater.java
// public class SincRepeater extends SincInterpolatingArray {
// 
//     /**
// 	 * @uml.property  name="fACTORY"
// 	 * @uml.associationEnd  
// 	 */
//     private static final Factory FACTORY = new Factory();
// 
//     public SincRepeater(double[] points, int order) {
//         super(points, order);
//     }
// 
//     public SincRepeater(double[] points) {
//         super(points);
//     }
// 
//     @Override
//     public double get(int i) {
// // @formatter:off
//         //  1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4
//         // -6-5-4-3-2-1 0 1 2 3 4 5 6 7
// // @formatter:on
//         int length = points.length;
//         int j = (i % length + length) % length;
//         return points[j];
//     }
// 
//     /**
// 	 * @return
// 	 * @uml.property  name="fACTORY"
// 	 */
//     public static Factory getFactory() {
//         return FACTORY;
//     }
// 
//     public static class Factory implements InterpolatingArray.Factory {
// 
//         @Override
//         public SincRepeater getInstance(double[] points) {
//             return new SincRepeater(points);
//         }
// 
//     }
// 
// }
// 
// Path: src/test/TestUtils.java
// public static final double DELTA = 0.00000001;


import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Random;
import org.junit.Test;
import filter.InterpolatingArray;
import filter.SincRepeater;
import static test.TestUtils.DELTA;
package test.filter;






public class SincRepeaterTest {

    @Test
    public final void testMirroredGet() {
        // 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4
        // -6-5-4-3-2-1 0 1 2 3 4 5 6 7
        double[] points = { 1, 2, 3, 4, 5, 6 };

        InterpolatingArray sia = new SincRepeater(points, 0);

        assertEquals(1, sia.get(0), DELTA);
        assertEquals(2, sia.get(1), DELTA);
        assertEquals(2, sia.get(-5), DELTA);
// Path: src/filter/InterpolatingArray.java
// public abstract class InterpolatingArray {
// 
//     protected final double[] points;
// 
//     public abstract double get(double x);
//     
//     public abstract double get(int i);
// 
//     protected int order = 2;
//     
//     public InterpolatingArray(double[] points, int order) {
//         this(points);
//         this.order = order;
//     }
// 
//     public InterpolatingArray(double[] points) {
//         this.points = points;
//     }
//     
//     public double[] getShiftedArray(double shift) { 
//     	int length = points.length;
//     	double[] result = new double[length]; 
//     	for (int i = 0; i < length; i++) { 
//     		result[i] = get(i+shift); 
//     	}
//     	return result;
//     }
// 
//     public final int length() { 
//     	return points.length;  
//     }
//     
//     public interface Factory {
//         InterpolatingArray getInstance(double[] points); 
//     }
// 
// }
// 
// Path: src/filter/SincRepeater.java
// public class SincRepeater extends SincInterpolatingArray {
// 
//     /**
// 	 * @uml.property  name="fACTORY"
// 	 * @uml.associationEnd  
// 	 */
//     private static final Factory FACTORY = new Factory();
// 
//     public SincRepeater(double[] points, int order) {
//         super(points, order);
//     }
// 
//     public SincRepeater(double[] points) {
//         super(points);
//     }
// 
//     @Override
//     public double get(int i) {
// // @formatter:off
//         //  1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4
//         // -6-5-4-3-2-1 0 1 2 3 4 5 6 7
// // @formatter:on
//         int length = points.length;
//         int j = (i % length + length) % length;
//         return points[j];
//     }
// 
//     /**
// 	 * @return
// 	 * @uml.property  name="fACTORY"
// 	 */
//     public static Factory getFactory() {
//         return FACTORY;
//     }
// 
//     public static class Factory implements InterpolatingArray.Factory {
// 
//         @Override
//         public SincRepeater getInstance(double[] points) {
//             return new SincRepeater(points);
//         }
// 
//     }
// 
// }
// 
// Path: src/test/TestUtils.java
// public static final double DELTA = 0.00000001;


// Path: src/test/filter/SincRepeaterTest.java
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Random;
import org.junit.Test;
import filter.InterpolatingArray;
import filter.SincRepeater;
import static test.TestUtils.DELTA;

package test.filter;






public class SincRepeaterTest {

    @Test
    public final void testMirroredGet() {
        // 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4
        // -6-5-4-3-2-1 0 1 2 3 4 5 6 7
        double[] points = { 1, 2, 3, 4, 5, 6 };

        InterpolatingArray sia = new SincRepeater(points, 0);

        assertEquals(1, sia.get(0), DELTA);
        assertEquals(2, sia.get(1), DELTA);
        assertEquals(2, sia.get(-5), DELTA);
        assertEquals(5, sia.get(-8), DELTA);