Skip to content

Commit 462d993

Browse files
authored
Enable column checker for MSSQL datatype testing (#638)
* add missing tests for mssql data types Signed-off-by: Billy Yuan <billy112487983@gmail.com> * move columnchecker to the common package Signed-off-by: Billy Yuan <billy112487983@gmail.com> * use column checker for mssql data type testing Signed-off-by: Billy Yuan <billy112487983@gmail.com>
1 parent 961e670 commit 462d993

28 files changed

+739
-319
lines changed

vertx-mssql-client/src/main/java/io/vertx/mssqlclient/impl/MSSQLRowImpl.java

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313

1414
import io.vertx.core.buffer.Buffer;
1515
import io.vertx.sqlclient.Row;
16+
import io.vertx.sqlclient.data.Numeric;
1617
import io.vertx.sqlclient.impl.ArrayTuple;
1718
import io.vertx.sqlclient.impl.RowDesc;
1819

19-
import java.math.BigDecimal;
2020
import java.time.*;
2121
import java.time.temporal.Temporal;
2222
import java.util.List;
@@ -46,10 +46,34 @@ public int getColumnIndex(String columnName) {
4646

4747
@Override
4848
public <T> T get(Class<T> type, int position) {
49-
if (type.isEnum()) {
49+
if (type == Boolean.class) {
50+
return type.cast(getBoolean(position));
51+
} else if (type == Byte.class) {
52+
return type.cast(getByte(position));
53+
} else if (type == Short.class) {
54+
return type.cast(getShort(position));
55+
} else if (type == Integer.class) {
56+
return type.cast(getInteger(position));
57+
} else if (type == Long.class) {
58+
return type.cast(getLong(position));
59+
} else if (type == Float.class) {
60+
return type.cast(getFloat(position));
61+
} else if (type == Double.class) {
62+
return type.cast(getDouble(position));
63+
} else if (type == Numeric.class) {
64+
return type.cast(getNumeric(position));
65+
} else if (type == String.class) {
66+
return type.cast(getString(position));
67+
} else if (type == LocalDate.class) {
68+
return type.cast(getLocalDate(position));
69+
} else if (type == LocalTime.class) {
70+
return type.cast(getLocalTime(position));
71+
}else if (type == Object.class) {
72+
return type.cast(getValue(position));
73+
} else if (type.isEnum()) {
5074
return type.cast(getEnum(type, position));
5175
} else {
52-
return super.get(type, position);
76+
throw new UnsupportedOperationException("Unsupported type " + type.getName());
5377
}
5478
}
5579

@@ -83,11 +107,6 @@ public UUID getUUID(String columnName) {
83107
throw new UnsupportedOperationException();
84108
}
85109

86-
@Override
87-
public BigDecimal getBigDecimal(String columnName) {
88-
throw new UnsupportedOperationException();
89-
}
90-
91110
@Override
92111
public Integer[] getIntegerArray(String columnName) {
93112
throw new UnsupportedOperationException();
@@ -158,6 +177,26 @@ public UUID[] getUUIDArray(String columnName) {
158177
throw new UnsupportedOperationException();
159178
}
160179

180+
private Byte getByte(int pos) {
181+
Object val = getValue(pos);
182+
if (val instanceof Byte) {
183+
return (Byte) val;
184+
} else if (val instanceof Number) {
185+
return ((Number) val).byteValue();
186+
}
187+
return null;
188+
}
189+
190+
private Numeric getNumeric(int pos) {
191+
Object val = getValue(pos);
192+
if (val instanceof Numeric) {
193+
return (Numeric) val;
194+
} else if (val instanceof Number) {
195+
return Numeric.parse(val.toString());
196+
}
197+
return null;
198+
}
199+
161200
private Object getEnum(Class enumType, int position) {
162201
Object val = getValue(position);
163202
if (val instanceof String) {

vertx-mssql-client/src/test/java/io/vertx/mssqlclient/data/MSSQLDataTypeTestBase.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,63 @@
1616
import io.vertx.mssqlclient.MSSQLConnectOptions;
1717
import io.vertx.mssqlclient.MSSQLConnection;
1818
import io.vertx.mssqlclient.MSSQLTestBase;
19+
import io.vertx.sqlclient.ColumnChecker;
1920
import io.vertx.sqlclient.Row;
2021
import io.vertx.sqlclient.Tuple;
22+
import io.vertx.sqlclient.data.Numeric;
2123
import org.junit.After;
2224
import org.junit.Before;
2325

26+
import java.util.ArrayList;
27+
import java.util.List;
2428
import java.util.function.Consumer;
2529

30+
import static io.vertx.sqlclient.ColumnChecker.*;
31+
2632
public abstract class MSSQLDataTypeTestBase extends MSSQLTestBase {
2733
Vertx vertx;
2834
MSSQLConnectOptions options;
2935

36+
static {
37+
ColumnChecker.load(() -> {
38+
List<ColumnChecker.SerializableBiFunction<Tuple, Integer, ?>> tupleMethods = new ArrayList<>();
39+
tupleMethods.add(Tuple::getValue);
40+
41+
tupleMethods.add(Tuple::getShort);
42+
tupleMethods.add(Tuple::getInteger);
43+
tupleMethods.add(Tuple::getLong);
44+
tupleMethods.add(Tuple::getFloat);
45+
tupleMethods.add(Tuple::getDouble);
46+
tupleMethods.add(Tuple::getBigDecimal);
47+
tupleMethods.add(Tuple::getString);
48+
tupleMethods.add(Tuple::getBoolean);
49+
tupleMethods.add(Tuple::getLocalDate);
50+
tupleMethods.add(Tuple::getLocalTime);
51+
52+
tupleMethods.add(getByIndex(Numeric.class));
53+
return tupleMethods;
54+
}, () -> {
55+
List<ColumnChecker.SerializableBiFunction<Row, String, ?>> rowMethods = new ArrayList<>();
56+
rowMethods.add(Row::getValue);
57+
58+
rowMethods.add(Row::getShort);
59+
rowMethods.add(Row::getInteger);
60+
rowMethods.add(Row::getLong);
61+
rowMethods.add(Row::getFloat);
62+
rowMethods.add(Row::getDouble);
63+
rowMethods.add(Row::getBigDecimal);
64+
rowMethods.add(Row::getString);
65+
rowMethods.add(Row::getBoolean);
66+
rowMethods.add(Row::getLocalDate);
67+
rowMethods.add(Row::getLocalTime);
68+
69+
70+
rowMethods.add(getByName(Numeric.class));
71+
72+
return rowMethods;
73+
});
74+
}
75+
3076
@Before
3177
public void setup() {
3278
vertx = Vertx.vertx();

vertx-mssql-client/src/test/java/io/vertx/mssqlclient/data/MSSQLEnumDataTypeTest.java

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
import io.vertx.ext.unit.TestContext;
1515
import io.vertx.ext.unit.junit.VertxUnitRunner;
16+
import io.vertx.sqlclient.ColumnChecker;
17+
import io.vertx.sqlclient.Row;
18+
import io.vertx.sqlclient.Tuple;
1619
import org.junit.Test;
1720
import org.junit.runner.RunWith;
1821

@@ -21,36 +24,36 @@ public class MSSQLEnumDataTypeTest extends MSSQLDataTypeTestBase {
2124
@Test
2225
public void testQueryDecodeStringToJavaEnum(TestContext ctx) {
2326
testQueryDecodeGenericWithoutTable(ctx, "test_enum", "varchar", "'large'", row -> {
24-
ctx.assertEquals(Size.large, row.get(Size.class, 0));
25-
ctx.assertEquals(Size.large, row.get(Size.class, "test_enum"));
26-
ctx.assertEquals("large", row.get(String.class, 0));
27-
ctx.assertEquals("large", row.get(String.class, "test_enum"));
28-
ctx.assertEquals("large", row.getString(0));
29-
ctx.assertEquals("large", row.getString("test_enum"));
27+
ColumnChecker.checkColumn(0, "test_enum")
28+
.returns(Tuple::getValue, Row::getValue, "large")
29+
.returns(Tuple::getString, Row::getString, "large")
30+
.returns(String.class, "large")
31+
.returns(Size.class, Size.large)
32+
.forRow(row);
3033
});
3134
}
3235

3336
@Test
3437
public void testPreparedQueryDecodeStringToJavaEnum(TestContext ctx) {
3538
testPreparedQueryDecodeGenericWithoutTable(ctx, "test_enum", "varchar", "'large'", row -> {
36-
ctx.assertEquals(Size.large, row.get(Size.class, 0));
37-
ctx.assertEquals(Size.large, row.get(Size.class, "test_enum"));
38-
ctx.assertEquals("large", row.get(String.class, 0));
39-
ctx.assertEquals("large", row.get(String.class, "test_enum"));
40-
ctx.assertEquals("large", row.getString(0));
41-
ctx.assertEquals("large", row.getString("test_enum"));
39+
ColumnChecker.checkColumn(0, "test_enum")
40+
.returns(Tuple::getValue, Row::getValue, "large")
41+
.returns(Tuple::getString, Row::getString, "large")
42+
.returns(String.class, "large")
43+
.returns(Size.class, Size.large)
44+
.forRow(row);
4245
});
4346
}
4447

4548
@Test
4649
public void testPreparedQueryEncodeJavaEnumToString(TestContext ctx) {
4750
testPreparedQueryEncodeGeneric(ctx, "nullable_datatype", "test_varchar", Size.medium, row -> {
48-
ctx.assertEquals(Size.medium, row.get(Size.class, 0));
49-
ctx.assertEquals(Size.medium, row.get(Size.class, "test_varchar"));
50-
ctx.assertEquals("medium", row.get(String.class, 0));
51-
ctx.assertEquals("medium", row.get(String.class, "test_varchar"));
52-
ctx.assertEquals("medium", row.getString(0));
53-
ctx.assertEquals("medium", row.getString("test_varchar"));
51+
ColumnChecker.checkColumn(0, "test_varchar")
52+
.returns(Tuple::getValue, Row::getValue, "medium")
53+
.returns(Tuple::getString, Row::getString, "medium")
54+
.returns(String.class, "medium")
55+
.returns(Size.class, Size.medium)
56+
.forRow(row);
5457
});
5558
}
5659

0 commit comments

Comments
 (0)