Increase test coverage
diff --git a/src/main/java/com/yahoo/sketches/MatrixFamily.java b/src/main/java/com/yahoo/sketches/MatrixFamily.java
index 83264f2..19a372e 100644
--- a/src/main/java/com/yahoo/sketches/MatrixFamily.java
+++ b/src/main/java/com/yahoo/sketches/MatrixFamily.java
@@ -26,7 +26,7 @@
* The Frequent Directions sketch is used for approximate Singular Value Decomposition (SVD) of a
* matrix.
*/
- MATRIX(128, "FrequentDirections", 2, 3),
+ MATRIX(128, "Matrix", 2, 3),
FREQUENTDIRECTIONS(129, "FrequentDirections", 2, 4);
diff --git a/src/main/java/com/yahoo/sketches/matrix/MatrixBuilder.java b/src/main/java/com/yahoo/sketches/matrix/MatrixBuilder.java
index 22746d6..7aa467d 100644
--- a/src/main/java/com/yahoo/sketches/matrix/MatrixBuilder.java
+++ b/src/main/java/com/yahoo/sketches/matrix/MatrixBuilder.java
@@ -32,7 +32,7 @@
private Algo type_ = Algo.OJALGO; // default type
- MatrixBuilder() {}
+ public MatrixBuilder() {}
/**
* Sets the underlying type of object to use with any Matrix objects created.
@@ -45,10 +45,10 @@
}
/**
- * Returns a value from an enum definig the type of object backing any Matrix objects created.
+ * Returns a value from an enum defining the type of object backing any Matrix objects created.
* @return An item from the Algo enum.
*/
- public Algo getFamily() {
+ public Algo getBackingType() {
return type_;
}
diff --git a/src/main/java/com/yahoo/sketches/matrix/MatrixPreambleUtil.java b/src/main/java/com/yahoo/sketches/matrix/MatrixPreambleUtil.java
index 4ad39d8..6690f7e 100644
--- a/src/main/java/com/yahoo/sketches/matrix/MatrixPreambleUtil.java
+++ b/src/main/java/com/yahoo/sketches/matrix/MatrixPreambleUtil.java
@@ -64,20 +64,6 @@
// Other constants
static final int SER_VER = 1;
-
-
- /**
- * Returns a human readable string summary of the preamble state of the given byte array.
- * Used primarily in testing.
- *
- * @param byteArr the given byte array.
- * @return the summary preamble string.
- */
- public static String preambleToString(final byte[] byteArr) {
- final Memory mem = Memory.wrap(byteArr);
- return preambleToString(mem);
- }
-
/**
* Returns a human readable string summary of the preamble state of the given Memory.
* Note: other than making sure that the given Memory size is large
@@ -87,14 +73,10 @@
* @param mem the given Memory.
* @return the summary preamble string.
*/
- private static String preambleToString(final Memory mem) {
+ public static String preambleToString(final Memory mem) {
final int preLongs = getAndCheckPreLongs(mem); // make sure we can get the assumed preamble
- final MatrixFamily family = MatrixFamily.idToFamily(mem.getByte(FAMILY_BYTE));
- if (family != MatrixFamily.MATRIX) {
- throw new IllegalArgumentException("Invalid family in memory region. Expected Matrix; "
- + "Found: " + family.getFamilyName());
- }
+ final MatrixFamily family = MatrixFamily.idToFamily(extractFamilyID(mem));
final int serVer = extractSerVer(mem);
if (serVer != SER_VER) {
diff --git a/src/test/java/com/yahoo/sketches/matrix/MatrixBuilderTest.java b/src/test/java/com/yahoo/sketches/matrix/MatrixBuilderTest.java
new file mode 100644
index 0000000..96793bb
--- /dev/null
+++ b/src/test/java/com/yahoo/sketches/matrix/MatrixBuilderTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2017, Yahoo! Inc.
+ * Licensed under the terms of the Apache License 2.0. See LICENSE file at the project root
+ * for terms.
+ */
+
+package com.yahoo.sketches.matrix;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.testng.annotations.Test;
+
+public class MatrixBuilderTest {
+ @Test
+ public void checkBuild() {
+ final MatrixBuilder builder = new MatrixBuilder();
+ assertEquals(builder.getBackingType(), MatrixBuilder.Algo.OJALGO); // default type
+
+ Matrix m = builder.build(128, 512);
+ assertNotNull(m);
+ }
+
+ @Test
+ public void checkSetType() {
+ final MatrixBuilder builder = new MatrixBuilder();
+ MatrixBuilder.Algo type = builder.getBackingType();
+ assertEquals(type, MatrixBuilder.Algo.OJALGO); // default type
+ assertEquals(type.getId(), MatrixBuilder.Algo.OJALGO.getId());
+ assertEquals(type.getName(), MatrixBuilder.Algo.OJALGO.getName());
+
+ builder.setType(MatrixBuilder.Algo.NATIVE);
+ assertEquals(builder.getBackingType(), MatrixBuilder.Algo.NATIVE);
+ assertEquals(builder.getBackingType().toString(), "native");
+
+ try {
+ builder.build(10, 20);
+ } catch (final IllegalArgumentException e) {
+ // expected until native is implemented
+ }
+ }
+
+}
diff --git a/src/test/java/com/yahoo/sketches/matrix/MatrixTest.java b/src/test/java/com/yahoo/sketches/matrix/MatrixTest.java
index 3db3442..131450e 100644
--- a/src/test/java/com/yahoo/sketches/matrix/MatrixTest.java
+++ b/src/test/java/com/yahoo/sketches/matrix/MatrixTest.java
@@ -7,6 +7,7 @@
import static org.testng.Assert.fail;
import com.yahoo.memory.Memory;
+import com.yahoo.memory.WritableMemory;
import com.yahoo.sketches.MatrixFamily;
import org.testng.annotations.Test;
@@ -17,6 +18,7 @@
final Matrix m = Matrix.builder().setType(MatrixBuilder.Algo.OJALGO).build(3, 3);
final byte[] bytes = m.toByteArray();
final Memory mem = Memory.wrap(bytes);
+ println(MatrixPreambleUtil.preambleToString(mem));
Matrix tgt = Matrix.heapify(mem, MatrixBuilder.Algo.OJALGO);
assertTrue(tgt instanceof MatrixImplOjAlgo);
@@ -79,6 +81,65 @@
assertEquals(m.getCompactSizeBytes(2, 2), expectedSize);
}
+ @Test
+ public void invalidSerVer() {
+ final int nRows = 50;
+ final int nCols = 75;
+ final MatrixBuilder mb = new MatrixBuilder();
+ final Matrix m = mb.build(nRows, nCols);
+ final byte[] sketchBytes = m.toByteArray();
+ final WritableMemory mem = WritableMemory.wrap(sketchBytes);
+ MatrixPreambleUtil.insertSerVer(mem.getArray(), mem.getCumulativeOffset(0L), 0);
+
+ try {
+ MatrixPreambleUtil.preambleToString(mem);
+ fail();
+ } catch (final IllegalArgumentException e) {
+ // expected
+ }
+ }
+
+ @Test
+ public void invalidFamily() {
+ final int nRows = 3;
+ final int nCols = 3;
+ final MatrixBuilder mb = new MatrixBuilder();
+ final Matrix m = mb.build(nRows, nCols);
+ final byte[] sketchBytes = m.toByteArray();
+ final WritableMemory mem = WritableMemory.wrap(sketchBytes);
+ MatrixPreambleUtil.insertFamilyID(mem.getArray(), mem.getCumulativeOffset(0L), 0);
+
+ try {
+ MatrixPreambleUtil.preambleToString(mem);
+ fail();
+ } catch (final IllegalArgumentException e) {
+ // expected
+ }
+ }
+
+ @Test
+ public void checkInsufficientMemoryCapacity() {
+ final byte[] bytes = new byte[6];
+ final Memory mem = Memory.wrap(bytes);
+ try {
+ MatrixPreambleUtil.preambleToString(mem);
+ fail();
+ } catch (final IllegalArgumentException e) {
+ // expected
+ }
+ }
+
+ @Test
+ public void checkCompactPreamble() {
+ final int nRows = 4;
+ final int nCols = 7;
+ final MatrixBuilder mb = new MatrixBuilder();
+ final Matrix m = mb.build(nRows, nCols);
+
+ final Memory mem = Memory.wrap(m.toCompactByteArray(nRows - 1, 7));
+ MatrixPreambleUtil.preambleToString(mem);
+ }
+
static void checkMatrixEquality(final Matrix m1, final Matrix m2) {
assertEquals(m1.numRows_, m2.numRows_);
assertEquals(m1.numCols_, m2.numCols_);
@@ -90,4 +151,8 @@
}
}
}
+
+ static void println(final String msg) {
+ System.out.println(msg);
+ }
}