Skip to content

Commit 1beb537

Browse files
tests: in cpp now we read all objects written by java tests, added extra externalizable types to tests, null object writer, torture class output, and updated TFW to 1.1.0
1 parent 0e90e43 commit 1beb537

25 files changed

Lines changed: 295 additions & 102 deletions

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION VERSION 3.30)
2-
project(JavaObjectStreams VERSION 1.3.8)
2+
project(JavaObjectStreams VERSION 1.3.9)
33

44
set(CMAKE_CXX_STANDARD 20)
55

src/type/object/parsers/ClassDataParser.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,12 @@ namespace javaobject::type::object::parsers {
106106
}
107107

108108
std::shared_ptr<object::ExternalizableClassDataObject>
109-
ClassDataParser::parseExternalizableClassData(type::object::ObjectTypeCodeParser &parser) const {}
109+
ClassDataParser::parseExternalizableClassData(type::object::ObjectTypeCodeParser &parser) const {
110+
throw std::runtime_error("externalizable");
111+
}
110112

111113
std::shared_ptr<object::ExternalizableBlockDataClassDataObject>
112-
ClassDataParser::parseExternalizableBlockDataClassData(type::object::ObjectTypeCodeParser &parser) const {}
114+
ClassDataParser::parseExternalizableBlockDataClassData(type::object::ObjectTypeCodeParser &parser) const {
115+
throw std::runtime_error("externalizable w/ blockdata");
116+
}
113117
} // namespace javaobject::type::object::parsers

tests/cpp/CMakeLists.txt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ if (NOT TARGET tfw)
1414
FetchContent_Declare(
1515
tfw
1616
GIT_REPOSITORY https://codeberg.org/Dexrn/tfw.git
17-
GIT_TAG 1.0.3
17+
GIT_TAG 1.1.0
1818
GIT_SHALLOW TRUE
1919
)
20+
2021
FetchContent_MakeAvailable(tfw)
2122
endif()
2223

@@ -31,9 +32,20 @@ target_link_libraries(JavaObjectStreams.Tests.CPP PRIVATE JavaObjectStreams tfw)
3132

3233
# ENABLE INDIVIDUAL TESTS HERE
3334
target_compile_definitions(JavaObjectStreams.Tests.CPP PRIVATE
34-
READ_OBJECT_FILE=false
35+
READ_OBJECT_FILE=true
3536
READ_NULL_OBJECT_FILE=true
3637
READ_ARRAY_OBJECT_FILE=true
3738
READ_ARRAY_OBJECT_FILE_WITH_EXTRA_DATA=true
39+
READ_NESTED_ARRAY_OBJECT_FILE=true
40+
READ_POLYMORPHIC_OBJECT_FILE=true
41+
READ_CUSTOM_UID_OBJECT_FILE=true
42+
READ_EXTERNALIZABLE_CLASS_OBJECT_FILE=true
43+
READ_EXTERNALIZABLE_EXTRA_DATA_CLASS_OBJECT_FILE=true
44+
READ_EMPTY_EXTERNALIZABLE_CLASS_OBJECT_FILE=true
45+
READ_ENUM_OBJECT_FILE=true
46+
READ_SUBCLASSED_CLASS_OBJECT_FILE=true
47+
READ_CLASS_OBJECT_WITH_LONG_FIELD_NAME=true
48+
READ_TORTURE_CLASS_OBJECT=true
49+
3850
READ_MINECRAFT_OBJECT_FILE=true
3951
)

tests/cpp/src/JavaObjectStreamsTests.cpp

Lines changed: 68 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -15,77 +15,85 @@
1515

1616
#include <TestFramework/TestFramework.h>
1717

18-
int main() {
19-
//todo add all tests
20-
tfw::TestFramework::getInstance()->addTest(READ_OBJECT_FILE, "Read input object", [](const tfw::test::util::TestOutputLogger &logger) {
21-
std::ifstream input("input/JOSTestClass.obj");
22-
input.exceptions(std::ios::badbit | std::ios::eofbit);
23-
24-
if (!input.is_open()) {
25-
throw std::runtime_error("nah");
26-
}
27-
28-
javaobject::stream::ObjectInputStream ois(input);
29-
auto obj = ois.readObject();
30-
});
31-
32-
tfw::TestFramework::getInstance()->addTest(READ_NULL_OBJECT_FILE, "Read null input object", [](const tfw::test::util::TestOutputLogger &logger) {
33-
std::ifstream input("input/JOSTestNull.obj");
34-
input.exceptions(std::ios::badbit | std::ios::eofbit);
35-
36-
if (!input.is_open()) {
37-
throw std::runtime_error("nah");
38-
}
18+
std::shared_ptr<javaobject::type::object::IObject> readObject(tfw::test::logging::loggers::ITestLogger &logger, const std::string &path) {
19+
std::ifstream input(path);
20+
input.exceptions(std::ios::badbit | std::ios::eofbit);
3921

40-
javaobject::stream::ObjectInputStream ois(input);
41-
auto obj = ois.readObject();
22+
if (!input.is_open()) {
23+
throw std::system_error(std::make_error_code(std::errc::no_such_file_or_directory));
24+
}
4225

43-
return tfw::test::result::TestResult(obj->instanceOf<javaobject::type::object::NullObject>());
44-
});
26+
logger << "Hello, world!" << std::endl;
4527

46-
tfw::TestFramework::getInstance()->addTest(READ_ARRAY_OBJECT_FILE, "Read array input object", [](const tfw::test::util::TestOutputLogger &logger) {
47-
std::ifstream input("input/JOSTestArray.obj");
48-
input.exceptions(std::ios::badbit | std::ios::eofbit);
28+
javaobject::stream::ObjectInputStream ois(input);
29+
return ois.readObject();
30+
}
4931

50-
if (!input.is_open()) {
51-
throw std::runtime_error("nah");
52-
}
32+
tfw::test::result::TestResult readObjectTest(tfw::test::logging::loggers::ITestLogger &logger, const std::string &path) {
33+
const auto obj = readObject(logger, path);
5334

54-
javaobject::stream::ObjectInputStream ois(input);
55-
auto obj = ois.readObject();
35+
return tfw::test::result::TestResult(true, obj->toString());
36+
}
5637

57-
return tfw::test::result::TestResult(obj->instanceOf<javaobject::type::object::types::ArrayObject>());
58-
});
38+
template <typename T>
39+
requires std::is_base_of_v<javaobject::type::object::IObject, T>
40+
tfw::test::result::TestResult readObjectTestRequireInstanceOf(tfw::test::logging::loggers::ITestLogger &logger, const std::string &path) {
41+
const auto obj = readObject(logger, path);
5942

60-
tfw::TestFramework::getInstance()->addTest(READ_ARRAY_OBJECT_FILE_WITH_EXTRA_DATA, "Read array + extra data input object", [](const tfw::test::util::TestOutputLogger &logger) {
61-
std::ifstream input("input/JOSTestArrayWithExtraData.obj");
62-
input.exceptions(std::ios::badbit | std::ios::eofbit);
43+
return tfw::test::result::TestResult(obj->instanceOf<T>(), obj->toString());
44+
}
6345

64-
if (!input.is_open()) {
65-
throw std::runtime_error("nah");
66-
}
46+
int main(const int argv, char *argc[]) {
47+
tfw::TestFramework t = tfw::TestFramework::fromArgs(argv, argc);
6748

68-
javaobject::stream::ObjectInputStream ois(input);
69-
auto dat = ois.readObject();
70-
auto array = ois.readObject();
71-
72-
return tfw::test::result::TestResult(array->instanceOf<javaobject::type::object::types::ArrayObject>());
73-
});
49+
//todo add all tests
50+
t.addTest(READ_OBJECT_FILE, "Read data class object", readObjectTest, "input/JOSDataClass.obj");
51+
t.addTest(READ_SUBCLASSED_CLASS_OBJECT_FILE, "Read class object with subclass fields", readObjectTest, "input/JOSSubclassedClass.obj");
52+
t.addTest(READ_NULL_OBJECT_FILE, "Read null object", readObjectTestRequireInstanceOf<javaobject::type::object::NullObject>, "input/JOSNullObject.obj");
53+
54+
t.addTest(READ_EXTERNALIZABLE_CLASS_OBJECT_FILE, "Read externalizable class object", readObjectTest, "input/JOSExternalizableClass.obj");
55+
t.addTest(READ_EXTERNALIZABLE_EXTRA_DATA_CLASS_OBJECT_FILE, "Read externalizable class object with extra data", readObjectTest, "input/JOSExternalizableWithExtraDataClass.obj");
56+
t.addTest(READ_EMPTY_EXTERNALIZABLE_CLASS_OBJECT_FILE, "Read empty externalizable class object", readObjectTest, "input/JOSEmptyExternalizableClass.obj");
57+
58+
t.addTest(READ_ARRAY_OBJECT_FILE, "Read array object", readObjectTest, "input/JOSArrayClass.obj");
59+
t.addTest(READ_NESTED_ARRAY_OBJECT_FILE, "Read nested array object", readObjectTest, "input/JOSNestedArrayClass.obj");
60+
61+
t.addTest(READ_POLYMORPHIC_OBJECT_FILE, "Read polymorphic class object", readObjectTest, "input/JOSPolymorphicClass.obj");
62+
t.addTest(READ_ENUM_OBJECT_FILE, "Read enum object", readObjectTest, "input/JOSEnumClass.obj");
63+
64+
t.addTest(READ_CUSTOM_UID_OBJECT_FILE, "Read object with custom serialVersionUid", readObjectTest, "input/JOSHasCustomSvUIDClass.obj");
65+
t.addTest(READ_CLASS_OBJECT_WITH_LONG_FIELD_NAME, "Read class object with long field name", readObjectTest, "input/JOSClassWithLongFieldName.obj");
66+
t.addTest(READ_TORTURE_CLASS_OBJECT, "Read torture object", readObjectTest, "input/JOSTortureClass.obj");
67+
68+
// t.addTest(READ_ARRAY_OBJECT_FILE_WITH_EXTRA_DATA, "Read array + extra data input object", [](const tfw::test::util::TestOutputLogger *logger) {
69+
// std::ifstream input("input/JOSTestArrayWithExtraData.obj");
70+
// input.exceptions(std::ios::badbit | std::ios::eofbit);
71+
//
72+
// if (!input.is_open()) {
73+
// throw std::runtime_error("nah");
74+
// }
75+
//
76+
// javaobject::stream::ObjectInputStream ois(input);
77+
// auto dat = ois.readObject();
78+
// auto array = ois.readObject();
79+
//
80+
// return tfw::test::result::TestResult(array->instanceOf<javaobject::type::object::types::ArrayObject>());
81+
// });
7482

7583
// TODO: Re-serialize read object in WRITE_MINECRAFT_OBJECT_FILE
76-
tfw::TestFramework::getInstance()->addTest(READ_MINECRAFT_OBJECT_FILE, "Read Minecraft object", [](const tfw::test::util::TestOutputLogger &logger) {
77-
std::ifstream input("input/MinecraftJOSTestClass.obj");
78-
input.exceptions(std::ios::badbit | std::ios::eofbit);
79-
80-
if (!input.is_open()) {
81-
throw std::runtime_error("nah");
82-
}
83-
84-
javaobject::stream::ObjectInputStream ois(input);
85-
auto obj = ois.readObject();
86-
});
87-
88-
tfw::TestFramework::getInstance()->run();
84+
// t.addTest(READ_MINECRAFT_OBJECT_FILE, "Read Minecraft object", [](const tfw::test::util::TestOutputLogger *logger) {
85+
// std::ifstream input("input/MinecraftJOSTestClass.obj");
86+
// input.exceptions(std::ios::badbit | std::ios::eofbit);
87+
//
88+
// if (!input.is_open()) {
89+
// throw std::runtime_error("nah");
90+
// }
91+
//
92+
// javaobject::stream::ObjectInputStream ois(input);
93+
// auto obj = ois.readObject();
94+
// });
95+
96+
t.run();
8997

9098
return 0;
9199
}

tests/java/modules/Common/src/main/java/me/dexrn/jos/common/test/JOSDataClass.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
package me.dexrn.jos.common.test;
1212

1313
import java.io.Serializable;
14-
import java.util.ArrayList;
1514
import java.util.List;
1615

1716
public class JOSDataClass implements Serializable {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package me.dexrn.jos.common.test;
2+
3+
import java.io.Serializable;
4+
5+
public enum JOSEnumClass implements Serializable {
6+
FIRST("First value"),
7+
SECOND("Second value"),
8+
THIRD("Third value"),
9+
FOURTH("Fourth value"),
10+
FIFTH("Fifth value"),
11+
INFO("Enum test class");
12+
13+
final String info;
14+
15+
JOSEnumClass(String info) {
16+
this.info = info;
17+
}
18+
}

tests/java/modules/Common/src/main/java/me/dexrn/jos/common/test/JOSArrayClass.java renamed to tests/java/modules/Common/src/main/java/me/dexrn/jos/common/test/array/JOSArrayClass.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
package me.dexrn.jos.common.test;
1+
package me.dexrn.jos.common.test.array;
2+
3+
import me.dexrn.jos.common.test.JOSDataClass;
24

35
import java.io.Serializable;
4-
import java.util.Arrays;
56
import java.util.stream.IntStream;
67
import java.util.stream.LongStream;
78
import java.util.stream.Stream;

tests/java/modules/Common/src/main/java/me/dexrn/jos/common/test/JOSNestedArrayClass.java renamed to tests/java/modules/Common/src/main/java/me/dexrn/jos/common/test/array/JOSNestedArrayClass.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package me.dexrn.jos.common.test;
1+
package me.dexrn.jos.common.test.array;
2+
3+
import me.dexrn.jos.common.test.JOSDataClass;
24

35
import java.io.Serializable;
46
import java.util.stream.Stream;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package me.dexrn.jos.common.test.externalizable;
2+
3+
import java.io.Externalizable;
4+
import java.io.IOException;
5+
import java.io.ObjectInput;
6+
import java.io.ObjectOutput;
7+
8+
public class JOSEmptyExternalizableClass implements Externalizable {
9+
@Override
10+
public void writeExternal(ObjectOutput objectOutput) throws IOException {}
11+
12+
@Override
13+
public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {}
14+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package me.dexrn.jos.common.test.externalizable;
2+
3+
import me.dexrn.jos.common.test.JOSDataClass;
4+
5+
import java.io.Externalizable;
6+
import java.io.IOException;
7+
import java.io.ObjectInput;
8+
import java.io.ObjectOutput;
9+
10+
public class JOSExternalizableClass implements Externalizable {
11+
String chars = "Hello, externalizable world!";
12+
13+
@Override
14+
public void writeExternal(ObjectOutput objectOutput) throws IOException {
15+
objectOutput.writeObject(chars);
16+
}
17+
18+
@Override
19+
public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {
20+
this.chars = (String) objectInput.readObject();
21+
}
22+
}

0 commit comments

Comments
 (0)