/*******************************************************************************
* Mission Control Technologies, Copyright (c) 2009-2012, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* The MCT platform is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* MCT includes source code licensed under additional open source licenses. See
* the MCT Open Source Licenses file included with this distribution or the About
* MCT Licenses dialog available at runtime from the MCT Help menu for additional
* information.
*******************************************************************************/
package plotter.xy;
import junit.framework.TestCase;
import plotter.DoubleData;
import plotter.xy.Compressor.StreamingCompressor;
public class JUnitDefaultCompressor extends TestCase {
private PointData indata;
private PointData expected;
private DefaultCompressor compressor;
private PointData outdata;
@Override
protected void setUp() throws Exception {
super.setUp();
indata = new PointData();
expected = new PointData();
compressor = new DefaultCompressor();
outdata = new PointData();
}
public void testCompress0() {
check();
}
public void testCompress1() {
in(.5, 1);
out(0, 1);
check();
}
public void testCompress1_NaN() {
in(.5, Double.NaN);
out(0, Double.NaN);
check();
}
public void testCompress2() {
in(.5, 1);
in(.6, 2);
out(0, 1);
out(0, 2);
check();
}
public void testCompress2_2() {
in(.5, 2);
in(.6, 1);
out(0, 2);
out(0, 1);
check();
}
public void testCompress2_NaN() {
in(.5, 1);
in(.6, Double.NaN);
out(0, 1);
out(0, Double.NaN);
check();
}
public void testCompress2_NaN2() {
in(.5, Double.NaN);
in(.6, 1);
out(0, Double.NaN);
out(0, 1);
check();
}
public void testCompress3() {
in(.5, 1);
in(.6, 2);
in(.7, 3);
out(0, 1);
out(0, 3);
check();
}
public void testCompress3_2() {
in(.5, 1);
in(.6, 3);
in(.7, 2);
out(0, 1);
out(0, 3);
out(0, 2);
check();
}
public void testCompress3_3() {
in(.5, 2);
in(.6, 1);
in(.7, 3);
out(0, 2);
out(0, 1);
out(0, 3);
check();
}
public void testCompress3_4() {
in(.5, 2);
in(.6, 3);
in(.7, 1);
out(0, 2);
out(0, 3);
out(0, 1);
check();
}
public void testCompress3_5() {
in(.5, 3);
in(.6, 1);
in(.7, 2);
out(0, 3);
out(0, 1);
out(0, 2);
check();
}
public void testCompress3_6() {
in(.5, 3);
in(.6, 2);
in(.7, 1);
out(0, 3);
out(0, 1);
check();
}
public void testCompress3_NaN() {
in(.5, Double.NaN);
in(.6, 2);
in(.7, 3);
out(0, Double.NaN);
out(0, 2);
out(0, 3);
check();
}
public void testCompress3_NaN2() {
in(.5, 1);
in(.6, Double.NaN);
in(.7, 3);
out(0, 1);
out(0, Double.NaN);
out(0, 3);
check();
}
public void testCompress3_NaN3() {
in(.5, 1);
in(.6, 2);
in(.7, Double.NaN);
out(0, 1);
out(0, 2);
out(0, Double.NaN);
check();
}
public void testCompress3_NaN4() {
in(.5, Double.NaN);
in(.6, 2);
in(.7, Double.NaN);
out(0, Double.NaN);
out(0, 2);
out(0, Double.NaN);
check();
}
public void testCompress() {
in(.51, 3);
in(.52, 4);
in(.53, 5);
in(.54, 6);
in(.55, 7);
in(.56, 1);
in(.57, 2);
out(0, 3);
out(0, 1);
out(0, 7);
out(0, 2);
check();
}
public void testCompress_2() {
in(.51, 1);
in(.52, 2);
in(.53, Double.NaN);
in(.54, 3);
in(.55, 4);
out(0, 1);
out(0, 2);
out(0, Double.NaN);
out(0, 3);
out(0, 4);
check();
}
public void testCompress_3() {
in(.51, 2);
in(.52, 1);
in(.53, Double.NaN);
in(.54, 4);
in(.55, 3);
out(0, 2);
out(0, 1);
out(0, Double.NaN);
out(0, 4);
out(0, 3);
check();
}
public void testCompress_4() {
in(.51, 4);
in(.52, 3);
in(.53, Double.NaN);
in(.54, 2);
in(.55, 1);
out(0, 4);
out(0, 3);
out(0, Double.NaN);
out(0, 2);
out(0, 1);
check();
}
public void testCompress_5() {
in(.51, 3);
in(.52, 4);
in(.53, Double.NaN);
in(.54, 1);
in(.55, 2);
out(0, 3);
out(0, 4);
out(0, Double.NaN);
out(0, 1);
out(0, 2);
check();
}
public void testCompress_6() {
in(1.2, -10);
in(1.4, -5);
in(1.6, Double.NaN);
in(1.8, 5);
out(1, -10);
out(1, -5);
out(1, Double.NaN);
out(1, 5);
check();
}
public void testCompress_7() {
in(1.2, -10);
in(1.4, Double.NaN);
in(1.6, -5);
in(1.8, 5);
out(1, -10);
out(1, Double.NaN);
out(1, -5);
out(1, 5);
check();
}
public void testCompress_8() {
in(1.2, -10);
in(1.25, -9);
in(1.3, Double.NaN);
in(1.35, -7);
in(1.4, -5);
in(1.6, Double.NaN);
in(1.8, 5);
out(1, -10);
out(1, -9);
out(1, Double.NaN);
out(1, -7);
out(1, -5);
out(1, Double.NaN);
out(1, 5);
check();
}
public void testCompress_9() {
in(1.1, -10);
in(1.2, Double.NaN);
in(1.3, -7);
in(1.4, -5);
in(1.5, Double.NaN);
in(1.6, -2);
in(1.7, 5);
out(1, -10);
out(1, Double.NaN);
out(1, -7);
out(1, -5);
out(1, Double.NaN);
out(1, -2);
out(1, 5);
check();
}
public void testCompress10() {
in(.3, Double.NaN);
in(.4, 1);
in(.5, Double.NaN);
in(.6, 2);
in(.7, Double.NaN);
in(.8, 5);
in(.9, Double.NaN);
out(0, Double.NaN);
out(0, 1);
out(0, Double.NaN);
out(0, 2);
out(0, Double.NaN);
out(0, 5);
out(0, Double.NaN);
check();
}
public void testCompress11() {
in(0, 5);
in(.2, Double.NaN);
in(.3, -10);
in(.4, -5);
in(.5, Double.NaN);
in(.7, 10);
out(0, 5);
out(0, Double.NaN);
out(0, -10);
out(0, -5);
out(0, Double.NaN);
out(0, 10);
check();
}
public void testCompress12() {
in(0.5, 5);
in(1, 5);
in(1.1, Double.NaN);
in(1.2, -5);
out(0, 5);
out(1, 5);
out(1, Double.NaN);
out(1, -5);
check();
}
public void testMultiBucket() {
in(.5, 1);
in(1.5, 2);
out(0, 1);
out(1, 2);
check();
}
public void testMultiBucket2() {
in(.5, 1);
in(2.5, 2);
in(4.5, 3);
out(0, 1);
out(2, 2);
out(4, 3);
check();
}
public void testMultiBucket3() {
in(.5, 1);
in(2.5, 2);
in(2.6, 2.3);
in(2.7, 2.5);
in(4.5, 3);
out(0, 1);
out(2, 2);
out(2, 2.5);
out(4, 3);
check();
}
public void testMultiBucket4() {
in(.5, 1);
in(1.4, Double.NaN);
in(1.5, 2);
out(0, 1);
out(1, Double.NaN);
out(1, 2);
check();
}
public void testStreaming() {
StreamingCompressor s = compressor.createStreamingCompressor(outdata, 0, 1);
assertEquals(1, s.add(0, 1));
expected.add(0, 1);
checkNoCompress();
assertEquals(2, s.add(.1, 2));
expected.add(0, 2);
checkNoCompress();
assertEquals(2, s.add(.2, 3));
expected.removeLast(2);
expected.add(0, 1);
expected.add(0, 3);
checkNoCompress();
assertEquals(3, s.add(.3, 2));
expected.add(0, 2);
checkNoCompress();
assertEquals(3, s.add(.4, 2.5));
expected.removeLast(1);
expected.add(0, 2.5);
checkNoCompress();
assertEquals(4, s.add(1, 5));
expected.add(1, 5);
checkNoCompress();
assertEquals(2, s.add(1, 6));
expected.add(1, 6);
checkNoCompress();
}
public void testFlatLine() {
in(.51, 3);
in(.52, 3);
in(.53, 3);
in(.54, 3);
in(.55, 3);
in(.56, 3);
in(.57, 3);
out(0, 3);
check();
}
public void testFlatLineNaN() {
in(.51, Double.NaN);
in(.52, Double.NaN);
in(.53, Double.NaN);
in(.54, Double.NaN);
in(.55, Double.NaN);
in(.56, Double.NaN);
in(.57, Double.NaN);
out(0, Double.NaN);
check();
}
private void in(double x, double y) {
indata.add(x, y);
}
private void out(double x, double y) {
expected.add(x, y);
}
private void check() {
compressor.compress(indata, outdata, 0, 1);
checkNoCompress();
}
private void checkNoCompress() {
StringBuffer b = new StringBuffer();
b.append("input = ");
appendPoints(b, indata);
b.append(", expected = ");
appendPoints(b, expected);
b.append(", actual = ");
appendPoints(b, outdata);
String msg = b.toString();
DoubleData outx = outdata.getX();
DoubleData outy = outdata.getY();
DoubleData expectedx = expected.getX();
DoubleData expectedy = expected.getY();
int n = expectedx.getLength();
assertEquals(msg, n, outx.getLength());
for(int i = 0; i < n; i++) {
assertEquals(msg + ", i = " + i, expectedx.get(i), outx.get(i));
assertEquals(msg + ", i = " + i, expectedy.get(i), outy.get(i));
}
}
private void appendPoints(StringBuffer b, PointData data) {
b.append("[");
DoubleData x = data.getX();
DoubleData y = data.getY();
int n = x.getLength();
for(int i = 0; i < n; i++) {
b.append("(");
b.append(x.get(i));
b.append(",");
b.append(y.get(i));
b.append(")");
if(i < n - 1) {
b.append(",");
}
}
b.append("]");
}
}