diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..f0ae348 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,26 @@ +name: Java CI + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Cache Maven packages + uses: actions/cache@v2 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Build with Maven + run: mvn --batch-mode --update-snapshots verify + - run: mkdir staging && cp target/*.jar staging + - uses: actions/upload-artifact@v2 + with: + name: Package + path: staging \ No newline at end of file diff --git a/.gitignore b/.gitignore index b473ad9..623a45d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,10 @@ +/node +/out /node_modules/ /test/*.class /package-lock.json /.nyc_output/ /coverage/ +/.idea +*.iml +/target \ No newline at end of file diff --git a/package.json b/package.json index 750bfcf..14147b6 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,13 @@ "name": "java-deserialization", "version": "0.1.0", "description": "Parse Java object serialization format using pure JavaScript", - "main": "src/index.js", + "main": "src/main/node/index.js", "scripts": { - "test": "nyc --reporter=html --reporter=text-summary mocha test/*.js", - "gentest": "cd test && javac *.java && java GenerateTestCases > generated.js && npm test" + "built": "echo 'build here'", + "lint": "echo 'no linting setup yet'", + "test": "nyc --reporter=html --reporter=text-summary mocha src/test/node/*.js", + "gentest": "java -classpath target/classes io.github.gagern.nodeJavaDeserialization.GenerateTestCases > src/test/node/generated.js && npm test", + "package": "echo 'make publishable artifact here'" }, "repository": { "type": "git", @@ -37,6 +40,6 @@ "long": "^4.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } } diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..225b7f6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + + io.github.gagern + 1.0.0-SNAPSHOT + nodeJavaDeserialization + jar + + + 1.13.4 + v20.12.1 + 10.5.0 + + + 1.8 + 1.8 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + 1.8 + 1.8 + + + + com.github.eirslett + frontend-maven-plugin + ${frontend-maven-plugin.version} + + + install node and npm + + install-node-and-npm + + + ${node.version} + ${npm.version} + + + + npm install + + npm + + generate-resources + + install + + + + npm lint + + npm + + generate-resources + + run lint + + + + npm gentest + + npm + + test-compile + + run gentest + + + + npm test + + npm + + test + + run test + + + + + + + + + + + + + + + + + + + + + + + + + npm package + + npm + + package + + run package + + + + + + + diff --git a/test/GenerateTestCases.java b/src/main/java/io/github/gagern/nodeJavaDeserialization/GenerateTestCases.java similarity index 92% rename from test/GenerateTestCases.java rename to src/main/java/io/github/gagern/nodeJavaDeserialization/GenerateTestCases.java index 516af3e..e4af550 100644 --- a/test/GenerateTestCases.java +++ b/src/main/java/io/github/gagern/nodeJavaDeserialization/GenerateTestCases.java @@ -1,3 +1,5 @@ +package io.github.gagern.nodeJavaDeserialization; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; @@ -10,15 +12,16 @@ class GenerateTestCases { public static void main(String[] args) throws Exception { System.out.print - ("'use strict';\n" + + ("//This is a generated file from GeneratedTestCases.java\n" + + "'use strict';\n" + "\n" + "const chai = require('chai');\n" + "const expect = chai.expect;\n" + "const zlib = require('zlib');\n" + - "const javaDeserialization = require('../');\n" + + "const javaDeserialization = require('../../main/node');\n" + "\n" + - "// Register a classdata parser for the CompletelyCustomFormat test.\n" + - "javaDeserialization.registerClassDataParser('CompletelyCustomFormat', '0000000000000001', cls => ({}));\n" + + "// Register a classdata parser for the io.github.gagern.nodeJavaDeserialization.CompletelyCustomFormat test.\n" + + "javaDeserialization.registerClassDataParser('io.github.gagern.nodeJavaDeserialization.CompletelyCustomFormat', '0000000000000001', cls => ({}));\n" + "\n" + "function testCase(b64data, checks) {\n" + " return function() {\n" + diff --git a/test/SerializationTestCase.java b/src/main/java/io/github/gagern/nodeJavaDeserialization/SerializationTestCase.java similarity index 85% rename from test/SerializationTestCase.java rename to src/main/java/io/github/gagern/nodeJavaDeserialization/SerializationTestCase.java index 2991509..09efd38 100644 --- a/test/SerializationTestCase.java +++ b/src/main/java/io/github/gagern/nodeJavaDeserialization/SerializationTestCase.java @@ -1,3 +1,5 @@ +package io.github.gagern.nodeJavaDeserialization; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/test/TestCases.java b/src/main/java/io/github/gagern/nodeJavaDeserialization/TestCases.java similarity index 92% rename from test/TestCases.java rename to src/main/java/io/github/gagern/nodeJavaDeserialization/TestCases.java index ad4ced6..0a437ff 100644 --- a/test/TestCases.java +++ b/src/main/java/io/github/gagern/nodeJavaDeserialization/TestCases.java @@ -1,3 +1,5 @@ +package io.github.gagern.nodeJavaDeserialization; + import java.io.Serializable; import java.util.HashMap; @@ -196,23 +198,23 @@ public void nulls() throws Exception { @SerializationTestCase public void inheritedField() throws Exception { writeObject(new DerivedClassWithAnotherField()); - checkStrictEqual("itm.class.name", "'DerivedClassWithAnotherField'"); - checkStrictEqual("itm.class.super.name", "'BaseClassWithField'"); + checkStrictEqual("itm.class.name", "'io.github.gagern.nodeJavaDeserialization.DerivedClassWithAnotherField'"); + checkStrictEqual("itm.class.super.name", "'io.github.gagern.nodeJavaDeserialization.BaseClassWithField'"); checkStrictEqual("itm.class.super.super", "null"); - checkStrictEqual("itm.extends.DerivedClassWithAnotherField.bar", "234"); - checkStrictEqual("itm.extends.DerivedClassWithAnotherField.foo", "undefined"); - checkStrictEqual("itm.extends.BaseClassWithField.foo", "123"); + checkStrictEqual("itm.extends['io.github.gagern.nodeJavaDeserialization.DerivedClassWithAnotherField'].bar", "234"); + checkStrictEqual("itm.extends['io.github.gagern.nodeJavaDeserialization.DerivedClassWithAnotherField'].foo", "undefined"); + checkStrictEqual("itm.extends['io.github.gagern.nodeJavaDeserialization.BaseClassWithField'].foo", "123"); checkStrictEqual("itm.bar", "234"); checkStrictEqual("itm.foo", "123"); } @SerializationTestCase public void duplicateField() throws Exception { writeObject(new DerivedClassWithSameField()); - checkStrictEqual("itm.class.name", "'DerivedClassWithSameField'"); - checkStrictEqual("itm.class.super.name", "'BaseClassWithField'"); + checkStrictEqual("itm.class.name", "'io.github.gagern.nodeJavaDeserialization.DerivedClassWithSameField'"); + checkStrictEqual("itm.class.super.name", "'io.github.gagern.nodeJavaDeserialization.BaseClassWithField'"); checkStrictEqual("itm.class.super.super", "null"); - checkStrictEqual("itm.extends.DerivedClassWithSameField.foo", "345"); - checkStrictEqual("itm.extends.BaseClassWithField.foo", "123"); + checkStrictEqual("itm.extends['io.github.gagern.nodeJavaDeserialization.DerivedClassWithSameField'].foo", "345"); + checkStrictEqual("itm.extends['io.github.gagern.nodeJavaDeserialization.BaseClassWithField'].foo", "123"); checkStrictEqual("itm.foo", "345"); } @@ -260,7 +262,7 @@ public void enums() throws Exception { checkInstanceof("one", "String"); checkLooseEqual("one", "'ONE'"); checkNotStrictEqual("one", "'ONE'"); - checkStrictEqual("one.class.name", "'SomeEnum'"); + checkStrictEqual("one.class.name", "'io.github.gagern.nodeJavaDeserialization.SomeEnum'"); checkThat("one.class.isEnum"); checkStrictEqual("one.class.super.name", "'java.lang.Enum'"); checkStrictEqual("one.class.super.super", "null"); @@ -410,7 +412,7 @@ public void enumMap() throws Exception { checkStrictEqual("itm.obj.THREE", "'baz'"); checkStrictEqual("itm.obj.ONE.value", "123"); checkKeys("itm.obj", "'ONE', 'THREE'"); - checkStrictEqual("itm.keyType.name", "'SomeEnum'"); + checkStrictEqual("itm.keyType.name", "'io.github.gagern.nodeJavaDeserialization.SomeEnum'"); checkThat("itm.keyType.isEnum"); checkInstanceof("itm.map", "Map"); checkStrictEqual("itm.map.get(three)", "'baz'"); diff --git a/src/index.js b/src/main/node/index.js similarity index 100% rename from src/index.js rename to src/main/node/index.js diff --git a/src/parser.js b/src/main/node/parser.js similarity index 100% rename from src/parser.js rename to src/main/node/parser.js diff --git a/src/util.js b/src/main/node/util.js similarity index 100% rename from src/util.js rename to src/main/node/util.js diff --git a/test/failures.js b/src/test/node/failures.js similarity index 98% rename from test/failures.js rename to src/test/node/failures.js index 73a52b2..d9f3a2d 100644 --- a/test/failures.js +++ b/src/test/node/failures.js @@ -1,7 +1,7 @@ "use strict"; const expect = require('chai').expect; -const javaDeserialization = require('../'); +const javaDeserialization = require('../../main/node'); const STREAM_MAGIC = "aced"; const STREAM_VERSION = "0005"; @@ -147,17 +147,17 @@ describe("Failure scenarios", function() { expect(parsing(template1({flags: 0}))) .to.throw("Don't know how to deserialize class with flags 0x0"); }); - + it("version 1 external", function() { expect(parsing(template1({flags: SC_EXTERNALIZABLE}))) .to.throw("Can't parse version 1 external content"); }); - + it("unknown primitive", function() { expect(parsing(template1({fieldType: "Q"}))) .to.throw("Don't know how to read field of type 'Q'"); }); - + it("bad classDesc", function() { expect(parsing(template1({classDesc: TC_OBJECT}))) .to.throw("Object not allowed here"); diff --git a/test/generated.js b/src/test/node/generated.js similarity index 77% rename from test/generated.js rename to src/test/node/generated.js index d850541..e1fd721 100644 --- a/test/generated.js +++ b/src/test/node/generated.js @@ -1,12 +1,13 @@ +//This is a generated file from GeneratedTestCases.java 'use strict'; const chai = require('chai'); const expect = chai.expect; const zlib = require('zlib'); -const javaDeserialization = require('../'); +const javaDeserialization = require('../../main/node'); -// Register a classdata parser for the CompletelyCustomFormat test. -javaDeserialization.registerClassDataParser('CompletelyCustomFormat', '0000000000000001', cls => ({})); +// Register a classdata parser for the io.github.gagern.nodeJavaDeserialization.CompletelyCustomFormat test. +javaDeserialization.registerClassDataParser('io.github.gagern.nodeJavaDeserialization.CompletelyCustomFormat', '0000000000000001', cls => ({})); function testCase(b64data, checks) { return function() { @@ -29,21 +30,18 @@ function testCase(b64data, checks) { describe('Deserialization of', function() { - it('ArrayDeque', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAFGphdmEudXRpbC5BcnJheURlcXVlIHzaLiQNoIsDAAB4cHcEAAAAAnQAA2Zvb3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAB7eHVxAH4AAAAAAAJxAH4ACXQAA0VuZA==', + it('Exception as regular object', testCase( + 'H4sIAAAAAAAAAIVSXWvUQBS9m83WNqAufmGrriBaUWQXQYWSIthllWKsoBWEBWU2ud1OnUzizMSNCqKIr+KrgvoHfBX8AX48FEQEH330TZ99seDc1P2Qgs7DTHJz7plzTu6rH1DJFGxvByvsFqsLJrv1i50VDI3/5OPVl1V9RDgAeQoAjoHKHHa5vAn3oKQVTA1bLmXS8BhbeYip4Yl8cX3snHfi4TfqtexD4ADxaW3/6Sl/79sNiMVllfRYR+CX9ycPz/TerJbBDaASskyjgZ2FzgYhGwOkH8DmCA3j4gJqzboWt20Ed9koLrt+GzxtWHhjUbHQImrtvyD9Dy2BMUpjKXfoLE2VJcRooFobqK63ZYaLRsC18fOUAvEMjJ1nnSSJbZy10Tg3cjtnj87Orh2Y6SdLYe75RwObePds+tTXRw648+AJLnEhizuoAtgSYSgY2WsKpjUJ2RTA+BIXuMBi/PPuxWiWk2hQKS69a6DcFNbQuN3rdLstWKDVMl1oIYf1ZiKEHQayfvCKjJOIL3GKnJz/2nro+Ovvj6sOlAJwha0Q+4T9ncf+TzCsT87B/dVrP2sFTSk0sGsk4SHM5qz7g1Iwn1GK3SYd+YPP+55+YM/LUJoHV/M7WBiEnkt7TqJ25xkdtBx6mLReWzL6DS3112r+AgAA', function(itm) { - expect(itm.list, "itm.list").to.be.an('Array'); - expect(itm.list, "itm.list").to.have.lengthOf(2); - expect(itm.list[0], "itm.list[0]").to.equal('foo'); - expect(itm.list[1].value, "itm.list[1].value").to.equal(123); + expect(itm.class.name, "itm.class.name").to.equal('java.lang.RuntimeException'); + expect(itm.detailMessage, "itm.detailMessage").to.equal('Kaboom'); })); - it('HashSet', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEudXRpbC5IYXNoU2V0ukSFlZa4tzQDAAB4cHcMAAAAED9AAAAAAAACdAADZm9vc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAHt4dXEAfgAAAAAAAnEAfgAJdAADRW5k', + it('string', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABdAAIc29tZXRleHR1cQB+AAAAAAACcQB+AAR0AANFbmQ=', function(itm) { - expect(itm.set, "itm.set").to.be.an.instanceof(Set); - expect(itm.set.size, "itm.set.size").to.equal(2); - expect(itm.set.has('foo'), "itm.set.has('foo')").to.be.true; + expect(typeof itm, "typeof itm").to.equal('string'); + expect(itm, "itm").to.equal('sometext'); })); it('canaries only', testCase( @@ -51,13 +49,6 @@ describe('Deserialization of', function() { function() { })); - it('string', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABdAAIc29tZXRleHR1cQB+AAAAAAACcQB+AAR0AANFbmQ=', - function(itm) { - expect(typeof itm, "typeof itm").to.equal('string'); - expect(itm, "itm").to.equal('sometext'); - })); - it('long string', testCase( 'H4sIAAAAAAAAAO3JuwnCABRA0Wc0veAUNlnATrATbAWr+CEYQvCTiIVkBjdwAWdxE3eQgGOcU12472+k7SUmm2WZ3/KsyusiW23Lw66ZPT/r1/g6rZKI+ykikibS+aE41ufoYvCIXv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/tpzdNFL+hg1MVzU+x8AC//OVwACAA==', function(itm) { @@ -75,13 +66,13 @@ describe('Deserialization of', function() { })); it('duplicate object', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEkJhc2VDbGFzc1dpdGhGaWVsZAAAAAAAABI0AgABSQADZm9veHAAAAB7dAAFZGVsaW1xAH4ABHVxAH4AAAAAAAJxAH4ABnQAA0VuZA==', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAO2lvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uQmFzZUNsYXNzV2l0aEZpZWxkAAAAAAAAEjQCAAFJAANmb294cAAAAHt0AAVkZWxpbXEAfgAEdXEAfgAAAAAAAnEAfgAGdAADRW5k', function(obj1, delim, obj2) { expect(obj1, "obj1").to.equal(obj2); })); it('primitive fields', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAD1ByaW1pdGl2ZUZpZWxkcwAAEjRWeJq8AgAIWgACYm9CAAJieUMAAWNEAAFkRgABZkkAAWlKAAFsUwABc3hwAesSNEAorhR64UeuQpkAAP///4X////////86/44dXEAfgAAAAAAAnEAfgAFdAADRW5k', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAOGlvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uUHJpbWl0aXZlRmllbGRzAAASNFZ4mrwCAAhaAAJib0IAAmJ5QwABY0QAAWRGAAFmSQABaUoAAWxTAAFzeHAB6xI0QCiuFHrhR65CmQAA////hf////////zr/jh1cQB+AAAAAAACcQB+AAV0AANFbmQ=', function(itm) { expect(itm.i, "itm.i").to.equal(-123); expect(itm.s, "itm.s").to.equal(-456); @@ -119,26 +110,26 @@ describe('Deserialization of', function() { })); it('inherited field', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAHERlcml2ZWRDbGFzc1dpdGhBbm90aGVyRmllbGQAAAAAAAAjRQIAAUkAA2JhcnhyABJCYXNlQ2xhc3NXaXRoRmllbGQAAAAAAAASNAIAAUkAA2Zvb3hwAAAAewAAAOp1cQB+AAAAAAACcQB+AAZ0AANFbmQ=', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IARWlvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uRGVyaXZlZENsYXNzV2l0aEFub3RoZXJGaWVsZAAAAAAAACNFAgABSQADYmFyeHIAO2lvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uQmFzZUNsYXNzV2l0aEZpZWxkAAAAAAAAEjQCAAFJAANmb294cAAAAHsAAADqdXEAfgAAAAAAAnEAfgAGdAADRW5k', function(itm) { - expect(itm.class.name, "itm.class.name").to.equal('DerivedClassWithAnotherField'); - expect(itm.class.super.name, "itm.class.super.name").to.equal('BaseClassWithField'); + expect(itm.class.name, "itm.class.name").to.equal('io.github.gagern.nodeJavaDeserialization.DerivedClassWithAnotherField'); + expect(itm.class.super.name, "itm.class.super.name").to.equal('io.github.gagern.nodeJavaDeserialization.BaseClassWithField'); expect(itm.class.super.super, "itm.class.super.super").to.equal(null); - expect(itm.extends.DerivedClassWithAnotherField.bar, "itm.extends.DerivedClassWithAnotherField.bar").to.equal(234); - expect(itm.extends.DerivedClassWithAnotherField.foo, "itm.extends.DerivedClassWithAnotherField.foo").to.equal(undefined); - expect(itm.extends.BaseClassWithField.foo, "itm.extends.BaseClassWithField.foo").to.equal(123); + expect(itm.extends['io.github.gagern.nodeJavaDeserialization.DerivedClassWithAnotherField'].bar, "itm.extends['io.github.gagern.nodeJavaDeserialization.DerivedClassWithAnotherField'].bar").to.equal(234); + expect(itm.extends['io.github.gagern.nodeJavaDeserialization.DerivedClassWithAnotherField'].foo, "itm.extends['io.github.gagern.nodeJavaDeserialization.DerivedClassWithAnotherField'].foo").to.equal(undefined); + expect(itm.extends['io.github.gagern.nodeJavaDeserialization.BaseClassWithField'].foo, "itm.extends['io.github.gagern.nodeJavaDeserialization.BaseClassWithField'].foo").to.equal(123); expect(itm.bar, "itm.bar").to.equal(234); expect(itm.foo, "itm.foo").to.equal(123); })); it('duplicate field', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAGURlcml2ZWRDbGFzc1dpdGhTYW1lRmllbGQAAAAAAAA0VgIAAUkAA2Zvb3hyABJCYXNlQ2xhc3NXaXRoRmllbGQAAAAAAAASNAIAAUkAA2Zvb3hwAAAAewAAAVl1cQB+AAAAAAACcQB+AAZ0AANFbmQ=', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAQmlvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uRGVyaXZlZENsYXNzV2l0aFNhbWVGaWVsZAAAAAAAADRWAgABSQADZm9veHIAO2lvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uQmFzZUNsYXNzV2l0aEZpZWxkAAAAAAAAEjQCAAFJAANmb294cAAAAHsAAAFZdXEAfgAAAAAAAnEAfgAGdAADRW5k', function(itm) { - expect(itm.class.name, "itm.class.name").to.equal('DerivedClassWithSameField'); - expect(itm.class.super.name, "itm.class.super.name").to.equal('BaseClassWithField'); + expect(itm.class.name, "itm.class.name").to.equal('io.github.gagern.nodeJavaDeserialization.DerivedClassWithSameField'); + expect(itm.class.super.name, "itm.class.super.name").to.equal('io.github.gagern.nodeJavaDeserialization.BaseClassWithField'); expect(itm.class.super.super, "itm.class.super.super").to.equal(null); - expect(itm.extends.DerivedClassWithSameField.foo, "itm.extends.DerivedClassWithSameField.foo").to.equal(345); - expect(itm.extends.BaseClassWithField.foo, "itm.extends.BaseClassWithField.foo").to.equal(123); + expect(itm.extends['io.github.gagern.nodeJavaDeserialization.DerivedClassWithSameField'].foo, "itm.extends['io.github.gagern.nodeJavaDeserialization.DerivedClassWithSameField'].foo").to.equal(345); + expect(itm.extends['io.github.gagern.nodeJavaDeserialization.BaseClassWithField'].foo, "itm.extends['io.github.gagern.nodeJavaDeserialization.BaseClassWithField'].foo").to.equal(123); expect(itm.foo, "itm.foo").to.equal(345); })); @@ -167,7 +158,7 @@ describe('Deserialization of', function() { })); it('array fields', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAC0FycmF5RmllbGRzAAAAAAAAAAECAANbAAJpYXQAAltJWwADaWFhdAADW1tJWwACc2F0ABNbTGphdmEvbGFuZy9TdHJpbmc7eHB1cgACW0lNumAmduqypQIAAHhwAAAAAwAAAAwAAAAiAAAAOHVyAANbW0kX9+RPGY+JPAIAAHhwAAAAAnVxAH4ACAAAAAIAAAALAAAADHVxAH4ACAAAAAMAAAAVAAAAFgAAABd1cgATW0xqYXZhLmxhbmcuU3RyaW5nO63SVufpHXtHAgAAeHAAAAACdAADZm9vdAADYmFydXEAfgAAAAAAAnEAfgASdAADRW5k', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IANGlvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uQXJyYXlGaWVsZHMAAAAAAAAAAQIAA1sAAmlhdAACW0lbAANpYWF0AANbW0lbAAJzYXQAE1tMamF2YS9sYW5nL1N0cmluZzt4cHVyAAJbSU26YCZ26rKlAgAAeHAAAAADAAAADAAAACIAAAA4dXIAA1tbSRf35E8Zj4k8AgAAeHAAAAACdXEAfgAIAAAAAgAAAAsAAAAMdXEAfgAIAAAAAwAAABUAAAAWAAAAF3VyABNbTGphdmEubGFuZy5TdHJpbmc7rdJW5+kde0cCAAB4cAAAAAJ0AANmb290AANiYXJ1cQB+AAAAAAACcQB+ABJ0AANFbmQ=', function(itm) { expect(itm.ia, "itm.ia").to.be.an('Array'); expect(itm.iaa, "itm.iaa").to.be.an('Array'); @@ -177,13 +168,13 @@ describe('Deserialization of', function() { })); it('enum', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABfnIACFNvbWVFbnVtAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAADT05FfnEAfgADdAAFVEhSRUVxAH4AB3VxAH4AAAAAAAJxAH4ACXQAA0VuZA==', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABfnIAMWlvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uU29tZUVudW0AAAAAAAAAABIAAHhyAA5qYXZhLmxhbmcuRW51bQAAAAAAAAAAEgAAeHB0AANPTkV+cQB+AAN0AAVUSFJFRXEAfgAHdXEAfgAAAAAAAnEAfgAJdAADRW5k', function(one, three, three2) { expect(typeof one, "typeof one").to.equal('object'); expect(one, "one").to.be.an.instanceof(String); expect(one == 'ONE', "one == 'ONE'").to.be.true; expect(one, "one").to.not.equal('ONE'); - expect(one.class.name, "one.class.name").to.equal('SomeEnum'); + expect(one.class.name, "one.class.name").to.equal('io.github.gagern.nodeJavaDeserialization.SomeEnum'); expect(one.class.isEnum, "one.class.isEnum").to.be.true; expect(one.class.super.name, "one.class.super.name").to.equal('java.lang.Enum'); expect(one.class.super.super, "one.class.super.super").to.equal(null); @@ -194,15 +185,8 @@ describe('Deserialization of', function() { expect(three2, "three2").to.equal(three); })); - it('Exception as regular object', testCase( - 'H4sIAAAAAAAAAIVSXWvUQBS9m83WNqAufmGrriBaUWQXQYWSIthllWKsoBWEBWU2ud1OnUzizMSNCqKIr+KrgvoHfBX8AX48FEQEH330TZ99seDc1P2Qgs7DTHJz7plzTu6rH1DJFGxvByvsFqsLJrv1i50VDI3/5OPVl1V9RDgAeQoAjoHKHHa5vAn3oKQVTA1bLmXS8BhbeYip4Yl8cX3snHfi4TfqtexD4ADxaW3/6Sl/79sNiMVllfRYR+CX9ycPz/TerJbBDaASskyjgZ2FzgYhGwOkH8DmCA3j4gJqzboWt20Ed9koLrt+GzxtWHhjUbHQImrtvyD9Dy2BMUpjKXfoLE2VJcRooFobqK63ZYaLRsC18fOUAvEMjJ1nnSSJbZy10Tg3cjtnj87Orh2Y6SdLYe75RwObePds+tTXRw648+AJLnEhizuoAtgSYSgY2WsKpjUJ2RTA+BIXuMBi/PPuxWiWk2hQKS69a6DcFNbQuN3rdLstWKDVMl1oIYf1ZiKEHQayfvCKjJOIL3GKnJz/2nro+Ovvj6sOlAJwha0Q+4T9ncf+TzCsT87B/dVrP2sFTSk0sGsk4SHM5qz7g1Iwn1GK3SYd+YPP+55+YM/LUJoHV/M7WBiEnkt7TqJ25xkdtBx6mLReWzL6DS3112r+AgAA', - function(itm) { - expect(itm.class.name, "itm.class.name").to.equal('java.lang.RuntimeException'); - expect(itm.detailMessage, "itm.detailMessage").to.equal('Kaboom'); - })); - it('custom format', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IADEN1c3RvbUZvcm1hdAAAAAAAAAABAwACSQADZm9vTAADYmFydAASTGphdmEvbGFuZy9TdHJpbmc7eHAAADA5dAANSGVsbG8sIFdvcmxkIXcLtestALXrLQC16y10AAhhbmQgbW9yZXh1cQB+AAAAAAACcQB+AAh0AANFbmQ=', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IANWlvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uQ3VzdG9tRm9ybWF0AAAAAAAAAAEDAAJJAANmb29MAANiYXJ0ABJMamF2YS9sYW5nL1N0cmluZzt4cAAAMDl0AA1IZWxsbywgV29ybGQhdwu16y0AtestALXrLXQACGFuZCBtb3JleHVxAH4AAAAAAAJxAH4ACHQAA0VuZA==', function(itm) { expect(itm['@'], "itm['@']").to.be.an('Array'); expect(itm['@'], "itm['@']").to.have.lengthOf(2); @@ -214,7 +198,7 @@ describe('Deserialization of', function() { })); it('completely custom format', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAFkNvbXBsZXRlbHlDdXN0b21Gb3JtYXQAAAAAAAAAAQMAAkkAA2Zvb0wAA2JhcnQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwdAANSGVsbG8sIFdvcmxkIXcPAAAwObXrLQC16y0AtesteHVxAH4AAAAAAAJxAH4AB3QAA0VuZA==', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAP2lvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uQ29tcGxldGVseUN1c3RvbUZvcm1hdAAAAAAAAAABAwACSQADZm9vTAADYmFydAASTGphdmEvbGFuZy9TdHJpbmc7eHB0AA1IZWxsbywgV29ybGQhdw8AADA5testALXrLQC16y14dXEAfgAAAAAAAnEAfgAHdAADRW5k', function(itm) { expect(itm['@'], "itm['@']").to.be.an('Array'); expect(itm['@'], "itm['@']").to.have.lengthOf(2); @@ -224,7 +208,7 @@ describe('Deserialization of', function() { })); it('externalizable', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IACEV4dGVybmFs8N9gtNEyHREMAAB4cHcPAAAAC7XrLQC16y0AtestdAAIYW5kIG1vcmV4dXEAfgAAAAAAAnEAfgAGdAADRW5k', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAMWlvLmdpdGh1Yi5nYWdlcm4ubm9kZUphdmFEZXNlcmlhbGl6YXRpb24uRXh0ZXJuYWyNBpwj8+bz8wwAAHhwdw8AAAALtestALXrLQC16y10AAhhbmQgbW9yZXh1cQB+AAAAAAACcQB+AAZ0AANFbmQ=', function(itm) { expect(itm['@'], "itm['@']").to.be.an('Array'); expect(itm['@'], "itm['@']").to.have.lengthOf(2); @@ -235,7 +219,7 @@ describe('Deserialization of', function() { })); it('long externalizable', testCase( - 'H4sIAAAAAAAAAFvzloG1tIhBONonK7EsUS8nMS9dzz8pKzW5xHrCuYj5AsWaOUwMDBUFDAwMTCUMrE6p6Zl5hQx1DIzFRQwcrhUlqUV5iTkf7idsuWgkK8gDUlkFVMkCxAwMjEzMLKxs7BycXNw8vHz8AoJCwiKiYuISklLSMrJy8gqKSsoqqmrqGppa2jq6evoGhkbGJqZm5haWVtY2tnb2Do5Ozi6ubu4enl7ePr5+/gGBQcEhoWHhEZFR0TGxcfEJiUnJKalp6RmZWdk5uXn5BYVFxSWlZeUVlVXVNbV19Q2NTc0trW3tHZ1d3T29ff0TJk6aPGXqtOkzZs6aPWfuvPkLFi5avGTpsuUrVq5avWbtuvUbNm7avGXrtu07du7avWfvvv0HDh46fOToseMnTp46febsufMXLl66fOXqtes3bt66fefuvfsPHj56/OTps+cvXr56/ebtu/cfPn76/OXrt+8/fv76/efvv/8j3f8lDByJeSkKuflFqRWloDQDAkwgBlsJA7NrXgoAi1fv5nwCAAA=', + 'H4sIAAAAAAAAAFvzloG1tIhBONonK7EsUS8nMS9dzz8pKzW5xHrCuYj5AsWaOUwMDBUFDAwMTCUMrE6p6Zl5hQx1DIzFRQyGmfl66ZklGaVJeumJ6alFeXp5+SmpXkBzXFKLU4syE3MyqxJLMvPz9FwrSoDSiTm9bHOUPz/7/JkHZGQV0EgWIGZgYGRiZmFlY+fg5OLm4eXjFxAUEhYRFROXkJSSlpGVk1dQVFJWUVVT19DU0tbR1dM3MDQyNjE1M7ewtLK2sbWzd3B0cnZxdXP38PTy9vH18w8IDAoOCQ0Lj4iMio6JjYtPSExKTklNS8/IzMrOyc3LLygsKi4pLSuvqKyqrqmtq29obGpuaW1r7+js6u7p7eufMHHS5ClTp02fMXPW7Dlz581fsHDR4iVLly1fsXLV6jVr163fsHHT5i1bt23fsXPX7j179+0/cPDQ4SNHjx0/cfLU6TNnz52/cPHS5StXr12/cfPW7Tt3791/8PDR4ydPnz1/8fLV6zdv373/8PHT5y9fv33/8fPX7z9///0f6f4vYeBIzEtRyM0vSq0oBSUuEGACMdhKGJhd81IAbs5j0qUCAAA=', function(itm) { expect(itm['@'], "itm['@']").to.be.an('Array'); expect(itm['@'], "itm['@']").to.have.lengthOf(2); @@ -299,14 +283,14 @@ describe('Deserialization of', function() { })); it('EnumMap', testCase( - 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEudXRpbC5FbnVtTWFwBl19976QfKEDAAFMAAdrZXlUeXBldAARTGphdmEvbGFuZy9DbGFzczt4cHZyAAhTb21lRW51bQAAAAAAAAAAEgAAeHIADmphdmEubGFuZy5FbnVtAAAAAAAAAAASAAB4cHcEAAAAAn5xAH4ABnQAA09ORXNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAB7fnEAfgAGdAAFVEhSRUV0AANiYXp4cQB+AAlxAH4ADnVxAH4AAAAAAAJxAH4AEXQAA0VuZA==', + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEudXRpbC5FbnVtTWFwBl19976QfKEDAAFMAAdrZXlUeXBldAARTGphdmEvbGFuZy9DbGFzczt4cHZyADFpby5naXRodWIuZ2FnZXJuLm5vZGVKYXZhRGVzZXJpYWxpemF0aW9uLlNvbWVFbnVtAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdwQAAAACfnEAfgAGdAADT05Fc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAHt+cQB+AAZ0AAVUSFJFRXQAA2JhenhxAH4ACXEAfgAOdXEAfgAAAAAAAnEAfgARdAADRW5k', function(itm, one, three) { expect(typeof itm.obj, "typeof itm.obj").to.equal('object'); expect(typeof itm['@'], "typeof itm['@']").to.equal('object'); expect(itm.obj.THREE, "itm.obj.THREE").to.equal('baz'); expect(itm.obj.ONE.value, "itm.obj.ONE.value").to.equal(123); expect(itm.obj, "itm.obj").to.have.all.keys(['ONE', 'THREE']); - expect(itm.keyType.name, "itm.keyType.name").to.equal('SomeEnum'); + expect(itm.keyType.name, "itm.keyType.name").to.equal('io.github.gagern.nodeJavaDeserialization.SomeEnum'); expect(itm.keyType.isEnum, "itm.keyType.isEnum").to.be.true; expect(itm.map, "itm.map").to.be.an.instanceof(Map); expect(itm.map.get(three), "itm.map.get(three)").to.equal('baz'); @@ -323,4 +307,21 @@ describe('Deserialization of', function() { expect(itm.list[1].value, "itm.list[1].value").to.equal(123); })); + it('ArrayDeque', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAFGphdmEudXRpbC5BcnJheURlcXVlIHzaLiQNoIsDAAB4cHcEAAAAAnQAA2Zvb3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAB7eHVxAH4AAAAAAAJxAH4ACXQAA0VuZA==', + function(itm) { + expect(itm.list, "itm.list").to.be.an('Array'); + expect(itm.list, "itm.list").to.have.lengthOf(2); + expect(itm.list[0], "itm.list[0]").to.equal('foo'); + expect(itm.list[1].value, "itm.list[1].value").to.equal(123); + })); + + it('HashSet', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEudXRpbC5IYXNoU2V0ukSFlZa4tzQDAAB4cHcMAAAAED9AAAAAAAACdAADZm9vc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAHt4dXEAfgAAAAAAAnEAfgAJdAADRW5k', + function(itm) { + expect(itm.set, "itm.set").to.be.an.instanceof(Set); + expect(itm.set.size, "itm.set.size").to.equal(2); + expect(itm.set.has('foo'), "itm.set.has('foo')").to.be.true; + })); + }); diff --git a/src/test/node/generatedOriginal.js b/src/test/node/generatedOriginal.js new file mode 100644 index 0000000..bd61cd2 --- /dev/null +++ b/src/test/node/generatedOriginal.js @@ -0,0 +1,326 @@ +'use strict'; + +const chai = require('chai'); +const expect = chai.expect; +const zlib = require('zlib'); +const javaDeserialization = require('../../main/node/index'); + +// Register a classdata parser for the CompletelyCustomFormat test. +javaDeserialization.registerClassDataParser('CompletelyCustomFormat', '0000000000000001', cls => ({})); + +function testCase(b64data, checks) { + return function() { + let bytes = Buffer.from(b64data, 'base64'); + if (b64data.substring(0, 4) === 'H4sI') + bytes = zlib.gunzipSync(bytes); + const res = javaDeserialization.parse(bytes); + const begin = res[0]; + const end = res[res.length - 1]; + expect(begin[0]).to.equal('Begin'); + expect(begin[1]).to.equal(begin); + expect(end[0]).to.equal(end); + expect(end[1]).to.equal('End'); + expect(res.length, + 'Number of serialized objects must match args list' + ).to.equal(checks.length + 2); + return checks.apply(null, res.slice(1, -1)); + }; +} + +describe('Deserialization of', function() { + + it('ArrayDeque', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAFGphdmEudXRpbC5BcnJheURlcXVlIHzaLiQNoIsDAAB4cHcEAAAAAnQAA2Zvb3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAB7eHVxAH4AAAAAAAJxAH4ACXQAA0VuZA==', + function(itm) { + expect(itm.list, "itm.list").to.be.an('Array'); + expect(itm.list, "itm.list").to.have.lengthOf(2); + expect(itm.list[0], "itm.list[0]").to.equal('foo'); + expect(itm.list[1].value, "itm.list[1].value").to.equal(123); + })); + + it('HashSet', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEudXRpbC5IYXNoU2V0ukSFlZa4tzQDAAB4cHcMAAAAED9AAAAAAAACdAADZm9vc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAHt4dXEAfgAAAAAAAnEAfgAJdAADRW5k', + function(itm) { + expect(itm.set, "itm.set").to.be.an.instanceof(Set); + expect(itm.set.size, "itm.set.size").to.equal(2); + expect(itm.set.has('foo'), "itm.set.has('foo')").to.be.true; + })); + + it('canaries only', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABdXEAfgAAAAAAAnEAfgADdAADRW5k', + function() { + })); + + it('string', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABdAAIc29tZXRleHR1cQB+AAAAAAACcQB+AAR0AANFbmQ=', + function(itm) { + expect(typeof itm, "typeof itm").to.equal('string'); + expect(itm, "itm").to.equal('sometext'); + })); + + it('long string', testCase( + 'H4sIAAAAAAAAAO3JuwnCABRA0Wc0veAUNlnATrATbAWr+CEYQvCTiIVkBjdwAWdxE3eQgGOcU12472+k7SUmm2WZ3/KsyusiW23Lw66ZPT/r1/g6rZKI+ykikibS+aE41ufoYvCIXv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/tpzdNFL+hg1MVzU+x8AC//OVwACAA==', + function(itm) { + expect(typeof itm, "typeof itm").to.equal('string'); + expect(itm, "itm").to.have.lengthOf(131072); + expect(itm[0], "itm[0]").to.equal('x'); + expect(itm[(1 << 17) - 1], "itm[(1 << 17) - 1]").to.equal('x'); + })); + + it('null', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABcHVxAH4AAAAAAAJxAH4AA3QAA0VuZA==', + function(itm) { + expect(typeof itm, "typeof itm").to.equal('object'); + expect(itm, "itm").to.equal(null); + })); + + it('duplicate object', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEkJhc2VDbGFzc1dpdGhGaWVsZAAAAAAAABI0AgABSQADZm9veHAAAAB7dAAFZGVsaW1xAH4ABHVxAH4AAAAAAAJxAH4ABnQAA0VuZA==', + function(obj1, delim, obj2) { + expect(obj1, "obj1").to.equal(obj2); + })); + + it('primitive fields', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAD1ByaW1pdGl2ZUZpZWxkcwAAEjRWeJq8AgAIWgACYm9CAAJieUMAAWNEAAFkRgABZkkAAWlKAAFsUwABc3hwAesSNEAorhR64UeuQpkAAP///4X////////86/44dXEAfgAAAAAAAnEAfgAFdAADRW5k', + function(itm) { + expect(itm.i, "itm.i").to.equal(-123); + expect(itm.s, "itm.s").to.equal(-456); + expect(String(itm.l), "String(itm.l)").to.equal('-789'); + expect(itm.l.toNumber(), "itm.l.toNumber()").to.equal(-789); + expect(itm.l.equals(-789), "itm.l.equals(-789)").to.be.true; + expect(itm.by, "itm.by").to.equal(-21); + expect(itm.d, "itm.d").to.equal(12.34); + expect(itm.f, "itm.f").to.equal(76.5); + expect(itm.bo, "itm.bo").to.equal(true); + expect(itm.c, "itm.c").to.equal('\u1234'); + expect(itm, "itm").to.have.all.keys(['i', 's', 'l', 'by', 'd', 'f', 'bo', 'c']); + expect(itm.class.serialVersionUID, "itm.class.serialVersionUID").to.equal('0000123456789abc'); + })); + + it('boxed primitives', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cP///4VzcgAPamF2YS5sYW5nLlNob3J0aE03EzRg2lICAAFTAAV2YWx1ZXhxAH4ABP44c3IADmphdmEubGFuZy5Mb25nO4vkkMyPI98CAAFKAAV2YWx1ZXhxAH4ABP////////zrc3IADmphdmEubGFuZy5CeXRlnE5ghO5Q9RwCAAFCAAV2YWx1ZXhxAH4ABOtzcgAQamF2YS5sYW5nLkRvdWJsZYCzwkopa/sEAgABRAAFdmFsdWV4cQB+AARAKK4UeuFHrnNyAA9qYXZhLmxhbmcuRmxvYXTa7cmi2zzw7AIAAUYABXZhbHVleHEAfgAEQpkAAHNyABFqYXZhLmxhbmcuQm9vbGVhbs0gcoDVnPruAgABWgAFdmFsdWV4cAFzcgATamF2YS5sYW5nLkNoYXJhY3RlcjSLR9lrGiZ4AgABQwAFdmFsdWV4cBI0dXEAfgAAAAAAAnEAfgAUdAADRW5k', + function(i, s, l, by, d, f, bo, c) { + expect(i.value, "i.value").to.equal(-123); + expect(s.value, "s.value").to.equal(-456); + expect(l.value.equals(-789), "l.value.equals(-789)").to.be.true; + expect(by.value, "by.value").to.equal(-21); + expect(d.value, "d.value").to.equal(12.34); + expect(f.value, "f.value").to.equal(76.5); + expect(bo.value, "bo.value").to.equal(true); + expect(c.value, "c.value").to.equal('\u1234'); + expect(i.class.name, "i.class.name").to.equal('java.lang.Integer'); + expect(s.class.name, "s.class.name").to.equal('java.lang.Short'); + expect(l.class.name, "l.class.name").to.equal('java.lang.Long'); + expect(by.class.name, "by.class.name").to.equal('java.lang.Byte'); + expect(d.class.name, "d.class.name").to.equal('java.lang.Double'); + expect(f.class.name, "f.class.name").to.equal('java.lang.Float'); + expect(bo.class.name, "bo.class.name").to.equal('java.lang.Boolean'); + expect(c.class.name, "c.class.name").to.equal('java.lang.Character'); + })); + + it('inherited field', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAHERlcml2ZWRDbGFzc1dpdGhBbm90aGVyRmllbGQAAAAAAAAjRQIAAUkAA2JhcnhyABJCYXNlQ2xhc3NXaXRoRmllbGQAAAAAAAASNAIAAUkAA2Zvb3hwAAAAewAAAOp1cQB+AAAAAAACcQB+AAZ0AANFbmQ=', + function(itm) { + expect(itm.class.name, "itm.class.name").to.equal('DerivedClassWithAnotherField'); + expect(itm.class.super.name, "itm.class.super.name").to.equal('BaseClassWithField'); + expect(itm.class.super.super, "itm.class.super.super").to.equal(null); + expect(itm.extends.DerivedClassWithAnotherField.bar, "itm.extends.DerivedClassWithAnotherField.bar").to.equal(234); + expect(itm.extends.DerivedClassWithAnotherField.foo, "itm.extends.DerivedClassWithAnotherField.foo").to.equal(undefined); + expect(itm.extends.BaseClassWithField.foo, "itm.extends.BaseClassWithField.foo").to.equal(123); + expect(itm.bar, "itm.bar").to.equal(234); + expect(itm.foo, "itm.foo").to.equal(123); + })); + + it('duplicate field', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAGURlcml2ZWRDbGFzc1dpdGhTYW1lRmllbGQAAAAAAAA0VgIAAUkAA2Zvb3hyABJCYXNlQ2xhc3NXaXRoRmllbGQAAAAAAAASNAIAAUkAA2Zvb3hwAAAAewAAAVl1cQB+AAAAAAACcQB+AAZ0AANFbmQ=', + function(itm) { + expect(itm.class.name, "itm.class.name").to.equal('DerivedClassWithSameField'); + expect(itm.class.super.name, "itm.class.super.name").to.equal('BaseClassWithField'); + expect(itm.class.super.super, "itm.class.super.super").to.equal(null); + expect(itm.extends.DerivedClassWithSameField.foo, "itm.extends.DerivedClassWithSameField.foo").to.equal(345); + expect(itm.extends.BaseClassWithField.foo, "itm.extends.BaseClassWithField.foo").to.equal(123); + expect(itm.foo, "itm.foo").to.equal(345); + })); + + it('primitive array', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABdXIAAltJTbpgJnbqsqUCAAB4cAAAAAMAAAAMAAAAIgAAADh1cQB+AAAAAAACcQB+AAV0AANFbmQ=', + function(itm) { + expect(itm, "itm").to.be.an('Array'); + expect(itm, "itm").to.have.lengthOf(3); + expect(itm[0], "itm[0]").to.equal(12); + expect(itm[1], "itm[1]").to.equal(34); + expect(itm[2], "itm[2]").to.equal(56); + expect(itm.class.name, "itm.class.name").to.equal('[I'); + })); + + it('nested array', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABdXIAFFtbTGphdmEubGFuZy5TdHJpbmc7Mk0JrYQy5FcCAAB4cAAAAAJ1cgATW0xqYXZhLmxhbmcuU3RyaW5nO63SVufpHXtHAgAAeHAAAAACdAABYXQAAWJ1cQB+AAUAAAABdAABY3VxAH4AAAAAAAJxAH4AC3QAA0VuZA==', + function(itm) { + expect(itm, "itm").to.be.an('Array'); + expect(itm, "itm").to.have.lengthOf(2); + expect(itm[0], "itm[0]").to.be.an('Array'); + expect(itm[0], "itm[0]").to.have.lengthOf(2); + expect(itm[1], "itm[1]").to.have.lengthOf(1); + expect(itm[0][0], "itm[0][0]").to.equal('a'); + expect(itm[0][1], "itm[0][1]").to.equal('b'); + expect(itm[1][0], "itm[1][0]").to.equal('c'); + })); + + it('array fields', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAC0FycmF5RmllbGRzAAAAAAAAAAECAANbAAJpYXQAAltJWwADaWFhdAADW1tJWwACc2F0ABNbTGphdmEvbGFuZy9TdHJpbmc7eHB1cgACW0lNumAmduqypQIAAHhwAAAAAwAAAAwAAAAiAAAAOHVyAANbW0kX9+RPGY+JPAIAAHhwAAAAAnVxAH4ACAAAAAIAAAALAAAADHVxAH4ACAAAAAMAAAAVAAAAFgAAABd1cgATW0xqYXZhLmxhbmcuU3RyaW5nO63SVufpHXtHAgAAeHAAAAACdAADZm9vdAADYmFydXEAfgAAAAAAAnEAfgASdAADRW5k', + function(itm) { + expect(itm.ia, "itm.ia").to.be.an('Array'); + expect(itm.iaa, "itm.iaa").to.be.an('Array'); + expect(itm.sa, "itm.sa").to.be.an('Array'); + expect(itm.iaa[1][2], "itm.iaa[1][2]").to.equal(23); + expect(itm.sa[1], "itm.sa[1]").to.equal('bar'); + })); + + it('enum', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABfnIACFNvbWVFbnVtAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAADT05FfnEAfgADdAAFVEhSRUVxAH4AB3VxAH4AAAAAAAJxAH4ACXQAA0VuZA==', + function(one, three, three2) { + expect(typeof one, "typeof one").to.equal('object'); + expect(one, "one").to.be.an.instanceof(String); + expect(one == 'ONE', "one == 'ONE'").to.be.true; + expect(one, "one").to.not.equal('ONE'); + expect(one.class.name, "one.class.name").to.equal('SomeEnum'); + expect(one.class.isEnum, "one.class.isEnum").to.be.true; + expect(one.class.super.name, "one.class.super.name").to.equal('java.lang.Enum'); + expect(one.class.super.super, "one.class.super.super").to.equal(null); + expect(three == 'THREE', "three == 'THREE'").to.be.true; + expect(typeof three2, "typeof three2").to.equal('object'); + expect(three2, "three2").to.be.an.instanceof(String); + expect(three2 == 'THREE', "three2 == 'THREE'").to.be.true; + expect(three2, "three2").to.equal(three); + })); + + it('Exception as regular object', testCase( + 'H4sIAAAAAAAAAIVSXWvUQBS9m83WNqAufmGrriBaUWQXQYWSIthllWKsoBWEBWU2ud1OnUzizMSNCqKIr+KrgvoHfBX8AX48FEQEH330TZ99seDc1P2Qgs7DTHJz7plzTu6rH1DJFGxvByvsFqsLJrv1i50VDI3/5OPVl1V9RDgAeQoAjoHKHHa5vAn3oKQVTA1bLmXS8BhbeYip4Yl8cX3snHfi4TfqtexD4ADxaW3/6Sl/79sNiMVllfRYR+CX9ycPz/TerJbBDaASskyjgZ2FzgYhGwOkH8DmCA3j4gJqzboWt20Ed9koLrt+GzxtWHhjUbHQImrtvyD9Dy2BMUpjKXfoLE2VJcRooFobqK63ZYaLRsC18fOUAvEMjJ1nnSSJbZy10Tg3cjtnj87Orh2Y6SdLYe75RwObePds+tTXRw648+AJLnEhizuoAtgSYSgY2WsKpjUJ2RTA+BIXuMBi/PPuxWiWk2hQKS69a6DcFNbQuN3rdLstWKDVMl1oIYf1ZiKEHQayfvCKjJOIL3GKnJz/2nro+Ovvj6sOlAJwha0Q+4T9ncf+TzCsT87B/dVrP2sFTSk0sGsk4SHM5qz7g1Iwn1GK3SYd+YPP+55+YM/LUJoHV/M7WBiEnkt7TqJ25xkdtBx6mLReWzL6DS3112r+AgAA', + function(itm) { + expect(itm.class.name, "itm.class.name").to.equal('java.lang.RuntimeException'); + expect(itm.detailMessage, "itm.detailMessage").to.equal('Kaboom'); + })); + + it('custom format', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IADEN1c3RvbUZvcm1hdAAAAAAAAAABAwACSQADZm9vTAADYmFydAASTGphdmEvbGFuZy9TdHJpbmc7eHAAADA5dAANSGVsbG8sIFdvcmxkIXcLtestALXrLQC16y10AAhhbmQgbW9yZXh1cQB+AAAAAAACcQB+AAh0AANFbmQ=', + function(itm) { + expect(itm['@'], "itm['@']").to.be.an('Array'); + expect(itm['@'], "itm['@']").to.have.lengthOf(2); + expect(Buffer.isBuffer(itm['@'][0]), "Buffer.isBuffer(itm['@'][0])").to.be.true; + expect(itm['@'][0].toString('hex'), "itm['@'][0].toString('hex')").to.equal('b5eb2d00b5eb2d00b5eb2d'); + expect(itm['@'][1], "itm['@'][1]").to.equal('and more'); + expect(itm.foo, "itm.foo").to.equal(12345); + expect(itm.bar, "itm.bar").to.equal('Hello, World!'); + })); + + it('completely custom format', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAFkNvbXBsZXRlbHlDdXN0b21Gb3JtYXQAAAAAAAAAAQMAAkkAA2Zvb0wAA2JhcnQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwdAANSGVsbG8sIFdvcmxkIXcPAAAwObXrLQC16y0AtesteHVxAH4AAAAAAAJxAH4AB3QAA0VuZA==', + function(itm) { + expect(itm['@'], "itm['@']").to.be.an('Array'); + expect(itm['@'], "itm['@']").to.have.lengthOf(2); + expect(itm['@'][0], "itm['@'][0]").to.equal('Hello, World!'); + expect(Buffer.isBuffer(itm['@'][1]), "Buffer.isBuffer(itm['@'][1])").to.be.true; + expect(itm['@'][1].toString('hex'), "itm['@'][1].toString('hex')").to.equal('00003039b5eb2d00b5eb2d00b5eb2d'); + })); + + it('externalizable', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IACEV4dGVybmFs8N9gtNEyHREMAAB4cHcPAAAAC7XrLQC16y0AtestdAAIYW5kIG1vcmV4dXEAfgAAAAAAAnEAfgAGdAADRW5k', + function(itm) { + expect(itm['@'], "itm['@']").to.be.an('Array'); + expect(itm['@'], "itm['@']").to.have.lengthOf(2); + expect(Buffer.isBuffer(itm['@'][0]), "Buffer.isBuffer(itm['@'][0])").to.be.true; + expect(itm['@'][0].toString('hex'), "itm['@'][0].toString('hex')").to.equal('0000000bb5eb2d00b5eb2d00b5eb2d'); + expect(itm['@'][1], "itm['@'][1]").to.equal('and more'); + expect(itm, "itm").to.have.all.keys(['@']); + })); + + it('long externalizable', testCase( + 'H4sIAAAAAAAAAFvzloG1tIhBONonK7EsUS8nMS9dzz8pKzW5xHrCuYj5AsWaOUwMDBUFDAwMTCUMrE6p6Zl5hQx1DIzFRQwcrhUlqUV5iTkf7idsuWgkK8gDUlkFVMkCxAwMjEzMLKxs7BycXNw8vHz8AoJCwiKiYuISklLSMrJy8gqKSsoqqmrqGppa2jq6evoGhkbGJqZm5haWVtY2tnb2Do5Ozi6ubu4enl7ePr5+/gGBQcEhoWHhEZFR0TGxcfEJiUnJKalp6RmZWdk5uXn5BYVFxSWlZeUVlVXVNbV19Q2NTc0trW3tHZ1d3T29ff0TJk6aPGXqtOkzZs6aPWfuvPkLFi5avGTpsuUrVq5avWbtuvUbNm7avGXrtu07du7avWfvvv0HDh46fOToseMnTp46febsufMXLl66fOXqtes3bt66fefuvfsPHj56/OTps+cvXr56/ebtu/cfPn76/OXrt+8/fv76/efvv/8j3f8lDByJeSkKuflFqRWloDQDAkwgBlsJA7NrXgoAi1fv5nwCAAA=', + function(itm) { + expect(itm['@'], "itm['@']").to.be.an('Array'); + expect(itm['@'], "itm['@']").to.have.lengthOf(2); + expect(Buffer.isBuffer(itm['@'][0]), "Buffer.isBuffer(itm['@'][0])").to.be.true; + expect(itm['@'][0], "itm['@'][0]").to.have.lengthOf(516); + expect(itm['@'][0].toString('hex', 0, 4), "itm['@'][0].toString('hex', 0, 4)").to.equal('00000200'); + expect(itm['@'][0].toString('hex', 4, 8), "itm['@'][0].toString('hex', 4, 8)").to.equal('00010203'); + expect(itm['@'][1], "itm['@'][1]").to.equal('and more'); + expect(itm, "itm").to.have.all.keys(['@']); + })); + + it('HashMap', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNob2xkeHA/QAAAAAAADHcIAAAAEAAAAAJ0AANiYXJ0AANiYXp0AANmb29zcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAe3h1cQB+AAAAAAACcQB+AAt0AANFbmQ=', + function(itm) { + expect(typeof itm.obj, "typeof itm.obj").to.equal('object'); + expect(typeof itm['@'], "typeof itm['@']").to.equal('object'); + expect(itm.obj.bar, "itm.obj.bar").to.equal('baz'); + expect(itm.obj.foo.value, "itm.obj.foo.value").to.equal(123); + expect(itm.obj, "itm.obj").to.have.all.keys(['foo', 'bar']); + expect(itm.map, "itm.map").to.be.an.instanceof(Map); + expect(itm.map.get('bar'), "itm.map.get('bar')").to.equal('baz'); + expect(itm.map.get('foo').value, "itm.map.get('foo').value").to.equal(123); + expect(itm.map.size, "itm.map.size").to.equal(2); + })); + + it('HashMap', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNob2xkeHA/QAAAAAAADHcIAAAAEAAAAAJ0AANiYXp0AANiYXJzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAe3QAA2Zvb3hxAH4ACXVxAH4AAAAAAAJxAH4AC3QAA0VuZA==', + function(itm, i123) { + expect(typeof itm.obj, "typeof itm.obj").to.equal('object'); + expect(typeof itm['@'], "typeof itm['@']").to.equal('object'); + expect(itm['@'], "itm['@']").to.be.an('Array'); + expect(itm.obj, "itm.obj").to.have.all.keys(['baz']); + expect(itm.obj.baz, "itm.obj.baz").to.equal('bar'); + expect(itm.map, "itm.map").to.be.an.instanceof(Map); + expect(itm.map.get('baz'), "itm.map.get('baz')").to.equal('bar'); + expect(itm.map.get(i123), "itm.map.get(i123)").to.equal('foo'); + expect(itm.map.size, "itm.map.size").to.equal(2); + })); + + it('empty HashMap', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNob2xkeHA/QAAAAAAAAHcIAAAAEAAAAAB4dXEAfgAAAAAAAnEAfgAFdAADRW5k', + function(itm) { + expect(typeof itm.obj, "typeof itm.obj").to.equal('object'); + expect(itm.obj, "itm.obj").to.be.an('object').that.is.empty; + expect(itm.map, "itm.map").to.be.an.instanceof(Map); + expect(itm.map.size, "itm.map.size").to.equal(0); + })); + + it('Hashtable', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAE2phdmEudXRpbC5IYXNodGFibGUTuw8lIUrkuAMAAkYACmxvYWRGYWN0b3JJAAl0aHJlc2hvbGR4cD9AAAAAAAAIdwgAAAALAAAAAnQAA2JhcnQAA2JhenQAA2Zvb3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAB7eHVxAH4AAAAAAAJxAH4AC3QAA0VuZA==', + function(itm) { + expect(typeof itm.obj, "typeof itm.obj").to.equal('object'); + expect(typeof itm['@'], "typeof itm['@']").to.equal('object'); + expect(itm.obj.bar, "itm.obj.bar").to.equal('baz'); + expect(itm.obj.foo.value, "itm.obj.foo.value").to.equal(123); + expect(itm.obj, "itm.obj").to.have.all.keys(['foo', 'bar']); + expect(itm.map, "itm.map").to.be.an.instanceof(Map); + expect(itm.map.get('bar'), "itm.map.get('bar')").to.equal('baz'); + expect(itm.map.get('foo').value, "itm.map.get('foo').value").to.equal(123); + expect(itm.map.size, "itm.map.size").to.equal(2); + })); + + it('EnumMap', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAEWphdmEudXRpbC5FbnVtTWFwBl19976QfKEDAAFMAAdrZXlUeXBldAARTGphdmEvbGFuZy9DbGFzczt4cHZyAAhTb21lRW51bQAAAAAAAAAAEgAAeHIADmphdmEubGFuZy5FbnVtAAAAAAAAAAASAAB4cHcEAAAAAn5xAH4ABnQAA09ORXNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAB7fnEAfgAGdAAFVEhSRUV0AANiYXp4cQB+AAlxAH4ADnVxAH4AAAAAAAJxAH4AEXQAA0VuZA==', + function(itm, one, three) { + expect(typeof itm.obj, "typeof itm.obj").to.equal('object'); + expect(typeof itm['@'], "typeof itm['@']").to.equal('object'); + expect(itm.obj.THREE, "itm.obj.THREE").to.equal('baz'); + expect(itm.obj.ONE.value, "itm.obj.ONE.value").to.equal(123); + expect(itm.obj, "itm.obj").to.have.all.keys(['ONE', 'THREE']); + expect(itm.keyType.name, "itm.keyType.name").to.equal('SomeEnum'); + expect(itm.keyType.isEnum, "itm.keyType.isEnum").to.be.true; + expect(itm.map, "itm.map").to.be.an.instanceof(Map); + expect(itm.map.get(three), "itm.map.get(three)").to.equal('baz'); + expect(itm.map.get(one).value, "itm.map.get(one).value").to.equal(123); + expect(itm.map.size, "itm.map.size").to.equal(2); + })); + + it('ArrayList', testCase( + 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJ0AAVCZWdpbnEAfgABc3IAE2phdmEudXRpbC5BcnJheUxpc3R4gdIdmcdhnQMAAUkABHNpemV4cAAAAAJ3BAAAAAJ0AANmb29zcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAe3h1cQB+AAAAAAACcQB+AAl0AANFbmQ=', + function(itm) { + expect(itm.list, "itm.list").to.be.an('Array'); + expect(itm.list, "itm.list").to.have.lengthOf(2); + expect(itm.list[0], "itm.list[0]").to.equal('foo'); + expect(itm.list[1].value, "itm.list[1].value").to.equal(123); + })); + +}); diff --git a/test/other.js b/src/test/node/other.js similarity index 94% rename from test/other.js rename to src/test/node/other.js index d8e9763..cef7666 100644 --- a/test/other.js +++ b/src/test/node/other.js @@ -2,7 +2,7 @@ const chai = require('chai'); const expect = chai.expect; -const javaDeserialization = require('../'); +const javaDeserialization = require('../../main/node'); const parse = javaDeserialization.parse; describe('Special cases', function() {