/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package com.bc.ceres.binio.expr;
import com.bc.ceres.binio.*;
import org.junit.*;
import java.io.*;
import static com.bc.ceres.binio.expr.ExpressionBuilder.*;
import static org.junit.Assert.*;
public class ExpressionBuilderTest {
@Test
public void testSequence() throws IOException {
SequenceExpr sequence = SEQ(UINT, 42);
assertEquals(true, sequence.isConstant());
Object result = sequence.evaluate(null);
assertTrue(result instanceof SequenceType);
SequenceType sequenceType = (SequenceType) result;
assertEquals(SimpleType.UINT, sequenceType.getElementType());
assertEquals(42, sequenceType.getElementCount());
}
@Test
public void testChoice() throws IOException {
ChoiceExpr choice = IF(CONSTANT(true), INT, DOUBLE);
assertEquals(true, choice.isConstant());
Object result = choice.evaluate(null);
assertTrue(result instanceof SimpleType);
assertEquals(SimpleType.INT, result);
choice = IF(CONSTANT(false), INT, DOUBLE);
assertEquals(true, choice.isConstant());
result = choice.evaluate(null);
assertTrue(result instanceof SimpleType);
assertEquals(SimpleType.DOUBLE, result);
}
@Test
public void testSelect() throws IOException {
final VariableExpr condition = new VariableExpr();
final SelectionExpr selection = SELECT(condition,
CASE("A", FLOAT),
CASE("B", DOUBLE),
DEFAULT(INT));
condition.value = "A";
assertEquals(false, selection.isConstant());
Object result = selection.evaluate(null);
assertTrue(result instanceof SimpleType);
assertEquals(SimpleType.FLOAT, result);
condition.value = "B";
assertEquals(false, selection.isConstant());
result = selection.evaluate(null);
assertTrue(result instanceof SimpleType);
assertEquals(SimpleType.DOUBLE, result);
condition.value = "X";
assertEquals(false, selection.isConstant());
result = selection.evaluate(null);
assertTrue(result instanceof SimpleType);
assertEquals(SimpleType.INT, result);
}
@Test
public void testComplexExpressionTree() {
final CompoundExpr SNAPSHOT_INFO =
COMP("Snapshot_Information",
MEMBER("Snapshot_Time", SEQ(UINT, 3)),
MEMBER("Snapshot_ID", UINT),
MEMBER("Snapshot_OBET", SEQ(UBYTE, 8)),
MEMBER("Position", SEQ(DOUBLE, 3)),
MEMBER("Velocity", SEQ(DOUBLE, 3)),
MEMBER("Vector_Source", UBYTE),
MEMBER("Q0", DOUBLE),
MEMBER("Q1", DOUBLE),
MEMBER("Q2", DOUBLE),
MEMBER("Q3", DOUBLE),
MEMBER("TEC", DOUBLE),
MEMBER("Geomag_F", DOUBLE),
MEMBER("Geomag_D", DOUBLE),
MEMBER("Geomag_I", DOUBLE),
MEMBER("Sun_RA", FLOAT),
MEMBER("Sun_DEC", FLOAT),
MEMBER("Sun_BT", FLOAT),
MEMBER("Accuracy", FLOAT),
MEMBER("Radiometric_Accuracy", SEQ(FLOAT, 2))
);
final CompoundExpr BT_DATA =
COMP("Bt_Data",
MEMBER("Flags", USHORT),
MEMBER("BT_Value_Real", FLOAT),
MEMBER("BT_Value_Imag", FLOAT),
MEMBER("Radiometric_Accuracy_of_Pixel", USHORT),
MEMBER("Incidence_Angle", USHORT),
MEMBER("Azimuth_Angle", USHORT),
MEMBER("Faraday_Rotation_Angle", USHORT),
MEMBER("Geometric_Rotation_Angle", USHORT),
MEMBER("Snapshot_ID_of_Pixel", UINT),
MEMBER("Footprint_Axis1", USHORT),
MEMBER("Footprint_Axis2", USHORT)
);
final CompoundExpr GRID_POINT_DATA =
COMP("Grid_Point_Data",
MEMBER("Grid_Point_ID", UINT), /*4*/
MEMBER("Grid_Point_Latitude", FLOAT), /*8*/
MEMBER("Grid_Point_Longitude", FLOAT),/*12*/
MEMBER("Grid_Point_Altitude", FLOAT), /*16*/
MEMBER("Grid_Point_Mask", UBYTE), /*17*/
MEMBER("BT_Data_Counter", UBYTE), /*18*/
MEMBER("Bt_Data_List",
SEQ(BT_DATA, IREF("BT_Data_Counter")))
);
final CompoundExpr MIR_SCLD1C =
COMP("MIR_SCLD1C",
MEMBER("Snapshot_Counter", UINT),
MEMBER("Snapshot_List",
SEQ(SNAPSHOT_INFO, IREF("Snapshot_Counter"))),
MEMBER("Grid_Point_Counter", UINT),
MEMBER("Grid_Point_List",
SEQ(GRID_POINT_DATA, IREF("Grid_Point_Counter")))
);
}
private static class VariableExpr extends AbstractExpression {
Object value;
public boolean isConstant() {
return false;
}
public Object evaluate(CompoundData context) throws IOException {
return value;
}
}
}