package water.rapids.ast.prims.assign;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import water.TestUtil;
import water.fvec.Frame;
import water.fvec.TestFrameBuilder;
import water.fvec.Vec;
import water.rapids.Rapids;
import water.rapids.Val;
import water.rapids.vals.ValFrame;
import java.util.Arrays;
import java.util.Random;
import static org.junit.Assert.*;
import static water.rapids.ast.prims.assign.AstRecAssignTestUtils.*;
@RunWith(Parameterized.class)
public class AstRectangleScalarAssignTest extends TestUtil {
@BeforeClass
static public void setup() { stall_till_cloudsize(1); }
@Parameterized.Parameters(name= "{index}: {2}")
public static Iterable<? extends Object> data() { return Arrays.asList(
new Object[]{1, 5, "Single Row"}, new Object[]{10000, 5, "Large Case"}, new Object[]{43978, 0, "Full Dataset"}
); }
@Parameterized.Parameter()
public int _nRows;
@Parameterized.Parameter(1)
public int _offset;
@Parameterized.Parameter(2)
public String _description; // not used
@Test
public void testEnumAssign() throws Exception {
final Frame data = makeTestFrame();
Frame output = null;
try {
String[] expectedCats = catVec2array(data.vec(2));
for (int i = 0; i < _nRows; i++)
expectedCats[i + _offset] = "c2";
String rapids = "(tmp= tst (:= data \"c2\" [2] [" + _offset + ":" + _nRows + "]))";
Val val = Rapids.exec(rapids);
output = val.getFrame();
String[] actualCats = catVec2array(output.vec(2));
assertArrayEquals(expectedCats, actualCats);
} finally {
data.delete();
if (output != null) {
output.delete();
}
}
}
@Test
public void testInvalidEnumAssign() throws Exception {
final Frame data = makeTestFrame();
Frame output = null;
try {
String rapids = "(tmp= tst (:= data \"Invalid\" [2] [" + _offset + "" + _nRows + "]))";
Val val = Rapids.exec(rapids);
if (val instanceof ValFrame) output = val.getFrame();
fail("Invalid categorical value shouldn't be assigned");
} catch (Exception e) {
assertEquals("Cannot assign value Invalid into a vector of type Enum.", e.getMessage());
} finally {
data.delete();
if (output != null) {
output.delete();
}
}
}
@Test
public void testStringAssign() throws Exception {
final Frame data = makeTestFrame();
Frame output = null;
try {
String[] expectedStrs = strVec2array(data.vec(1));
for (int i = 0; i < _nRows; i++)
expectedStrs[i + _offset] = "New Value";
String rapids = "(tmp= tst (:= data \"New Value\" [1] [" + _offset + ":" + _nRows + "]))";
Val val = Rapids.exec(rapids);
output = val.getFrame();
String[] actualStrs = strVec2array(output.vec(1));
assertArrayEquals(expectedStrs, actualStrs);
} finally {
data.delete();
if (output != null) {
output.delete();
}
}
}
@Test
public void testNumberAssign() throws Exception {
final Frame data = makeTestFrame();
Frame output = null;
try {
double[] expected = vec2array(data.vec(0));
for (int i = 0; i < _nRows; i++)
expected[i + _offset] = 42.0;
String rapids = "(tmp= tst (:= data 42.0 [0] [" + _offset + ":" + _nRows + "]))";
Val val = Rapids.exec(rapids);
output = val.getFrame();
double[] actual = vec2array(output.vec(0));
assertArrayEquals(expected, actual, 0.0001);
} finally {
data.delete();
if (output != null) {
output.delete();
}
}
}
@Test
public void testNAAssign() throws Exception {
final Frame data = makeTestFrame();
Frame output = null;
try {
double[] expectedNums = vec2array(data.vec(0));
String[] expectedCats = catVec2array(data.vec(2));
for (int i = 0; i < _nRows; i++) {
expectedNums[i + _offset] = Double.NaN;
expectedCats[i + _offset] = null;
}
String rapids = "(tmp= tst (:= data NA [0,2] [" + _offset + ":" + _nRows + "]))";
Val val = Rapids.exec(rapids);
output = val.getFrame();
double[] actualNums = vec2array(output.vec(0));
assertArrayEquals(expectedNums, actualNums, 0.0001);
String[] actualCats = catVec2array(output.vec(2));
assertArrayEquals(expectedCats, actualCats);
} finally {
data.delete();
if (output != null) {
output.delete();
}
}
}
private Frame makeTestFrame() {
Random rnd = new Random();
final int len = 43978;
double numData[] = new double[len];
String[] strData = new String[len];
String[] catData = new String[len];
for (int i = 0; i < len; i++) {
numData[i] = rnd.nextDouble();
strData[i] = "s" + Character.toString((char) ('A' + rnd.nextInt('Z' - 'A')));
catData[i] = "c" + Character.toString((char) ('0' + rnd.nextInt('9' - '0')));
}
return new TestFrameBuilder()
.withName("data")
.withColNames("Num", "Str", "Cat")
.withVecTypes(Vec.T_NUM, Vec.T_STR, Vec.T_CAT)
.withDataForCol(0, numData)
.withDataForCol(1, strData)
.withDataForCol(2, catData)
.withChunkLayout(10000, 10000, 20000, 3978)
.build();
}
}