package water.rapids.ast.prims.assign;
import org.junit.BeforeClass;
import org.junit.Test;
import water.Key;
import water.MRTask;
import water.TestUtil;
import water.fvec.Chunk;
import water.fvec.Frame;
import water.fvec.NewChunk;
import water.fvec.Vec;
import water.rapids.Rapids;
import water.rapids.Val;
import water.rapids.vals.ValFrame;
import java.util.UUID;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class AstRectangleConditionalAssignTest extends TestUtil {
@BeforeClass static public void setup() { stall_till_cloudsize(1); }
@Test public void testConditionalAssignNumber() {
Frame fr = makeTestFrame();
Vec expected = dvec(11.2, -1, 33.6, -1, 56.0);
try {
Val val = Rapids.exec("(tmp= py_1 (:= data -1 1 (== (cols_py data 4) \"a\")))");
if (val instanceof ValFrame) {
Frame fr2 = val.getFrame();
assertVecEquals(expected, fr2.vec(1), 0.00001);
fr2.remove();
}
} finally {
fr.remove();
expected.remove();
}
}
@Test public void testConditionalAssignUUID() {
UUID newUUID = UUID.randomUUID();
Frame fr = makeTestFrame();
Vec expected = uvec(new UUID(10, 1), newUUID, new UUID(30, 3), newUUID, new UUID(50, 5));
try {
Val val = Rapids.exec("(tmp= py_1 (:= data \"" + newUUID.toString() + "\" 2 (== (cols_py data 4) \"a\")))");
if (val instanceof ValFrame) {
Frame fr2 = val.getFrame();
assertUUIDVecEquals(expected, fr2.vec(2));
fr2.remove();
}
} finally {
fr.remove();
expected.remove();
}
}
@Test public void testConditionalAssignString() {
Frame fr = makeTestFrame();
Vec expected = svec("row1", "tst", "row3", "tst", "row5");
try {
Val val = Rapids.exec("(tmp= py_1 (:= data \"tst\" 3 (== (cols_py data 4) \"a\")))");
if (val instanceof ValFrame) {
Frame fr2 = val.getFrame();
assertStringVecEquals(expected, fr2.vec(3));
fr2.remove();
}
} finally {
fr.remove();
expected.remove();
}
}
@Test public void testConditionalAssignCategorical() {
Frame fr = makeTestFrame();
Vec expected = cvec(new String[]{"a", "b"}, "b", "b", "b", "b", "b");
try {
Val val = Rapids.exec("(tmp= py_1 (:= data \"b\" 4 (== (cols_py data 4) \"a\")))");
if (val instanceof ValFrame) {
Frame fr2 = val.getFrame();
assertCatVecEquals(expected, fr2.vec(4));
fr2.remove();
}
} finally {
fr.remove();
expected.remove();
}
}
@Test public void testConditionalAssignDense() {
Frame fr = makeTestFrame();
Vec expected = ivec(-1, -1, -1, -1, -1);
try {
Val val = Rapids.exec("(tmp= py_1 (:= data -1 2 (> (cols_py data 0) 0)))");
if (val instanceof ValFrame) {
Frame fr2 = val.getFrame();
assertVecEquals(expected, fr2.vec(2), 0.00001);
fr2.remove();
}
} finally {
fr.remove();
expected.remove();
}
}
@Test public void testWrongTypeAssignString() {
Frame fr = makeTestFrame();
try {
Rapids.exec("(tmp= py_1 (:= data \"tst\" 1 (== (cols_py data 4) \"a\")))");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException e) {
assertEquals("Cannot assign value tst into a vector of type Numeric.", e.getMessage());
} finally {
fr.remove();
}
}
@Test public void testWrongTypeAssignNum() {
Frame fr = makeTestFrame();
try {
Rapids.exec("(tmp= py_1 (:= data 9 3 (== (cols_py data 4) \"a\")))");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException e) {
assertEquals("Cannot assign value 9.0 into a vector of type String.", e.getMessage());
} finally {
fr.remove();
}
}
@Test public void testWrongCategoricalAssign() {
Frame fr = makeTestFrame();
try {
Rapids.exec("(tmp= py_1 (:= data \"c\" 4 (== (cols_py data 4) \"a\")))");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException e) {
assertEquals("Cannot assign value c into a vector of type Enum.", e.getMessage());
} finally {
fr.remove();
}
}
private Frame makeTestFrame() {
Frame fr = null;
Vec v = ivec(1, 2, 3, 4, 5);
try {
fr = new MRTask() {
@Override
public void map(Chunk[] cs, NewChunk[] ncs) {
for (int i = 0; i < cs[0]._len; i++) {
int r = (int) cs[0].atd(i);
ncs[0].addNum(r);
ncs[1].addNum(11.2 * r);
ncs[2].addUUID(r, r * 10);
ncs[3].addStr("row" + r);
ncs[4].addCategorical(r % 2 == 0 ? 0 : 1);
}
}
}.doAll(new byte[]{Vec.T_NUM, Vec.T_NUM, Vec.T_UUID, Vec.T_STR, Vec.T_CAT}, v).outputFrame(Key.make("data"),
new String[]{"v1", "v2", "v3", "v4", "v5"},
new String[][]{null, null, null, null, new String[]{"a", "b"}});
} finally {
v.remove();
}
assert fr != null;
return fr;
}
}