Add a test for JavaScript UTF-8 <=> UTF-16 conversion
authorEvan Wallace <evan.exe@gmail.com>
Thu, 20 Aug 2015 06:53:55 +0000 (23:53 -0700)
committerEvan Wallace <evan.exe@gmail.com>
Thu, 15 Oct 2015 04:15:57 +0000 (21:15 -0700)
JavaScript uses UTF-16 but FlatBuffers uses UTF-8. This commit tests the code
that does the conversion between the two encodings. The last entry in the array
is tricky because each code point actually requires two UTF-16 code units,
unlike the other examples. The current JSON output of flatc actually handles
this case incorrectly (it generates invalid JSON with UTF-8 code units). The
generated JavaScript code passes these tests fine, however.

.gitignore
tests/JavaScriptTest.js
tests/JavaScriptTest.sh
tests/unicode_test.json [new file with mode: 0644]

index 69e7586..ca18d20 100755 (executable)
@@ -45,6 +45,7 @@ tests/go_gen
 tests/monsterdata_java_wire.mon
 tests/monsterdata_go_wire.mon
 tests/monsterdata_javascript_wire.mon
+tests/unicode_test.mon
 CMakeLists.txt.user
 CMakeScripts/**
 CTestTestfile.cmake
index af62a4e..8e23d83 100644 (file)
@@ -1,3 +1,4 @@
+// Run this using JavaScriptTest.sh
 var assert = require('assert');
 var fs = require('fs');
 
@@ -66,6 +67,8 @@ function main() {
   // Test it:
   testBuffer(fbb.dataBuffer());
 
+  testUnicode();
+
   console.log('FlatBuffers test: completed successfully');
 }
 
@@ -113,4 +116,29 @@ function testBuffer(bb) {
   assert.strictEqual(monster.testbool(), false);
 }
 
+function testUnicode() {
+  var correct = fs.readFileSync('unicode_test.mon');
+  var json = JSON.parse(fs.readFileSync('unicode_test.json', 'utf8'));
+
+  // Test reading
+  var bb = new flatbuffers.ByteBuffer(new Uint8Array(correct));
+  var monster = MyGame.Example.Monster.getRootAsMonster(bb);
+  assert.strictEqual(monster.name(), json.name);
+  assert.strictEqual(monster.testarrayofstringLength(), json.testarrayofstring.length);
+  json.testarrayofstring.forEach(function(string, i) {
+    assert.strictEqual(monster.testarrayofstring(i), string);
+  });
+
+  // Test writing
+  var fbb = new flatbuffers.Builder();
+  var name = fbb.createString(json.name);
+  var testarrayofstringOffset = MyGame.Example.Monster.createTestarrayofstringVector(fbb,
+    json.testarrayofstring.map(function(string) { return fbb.createString(string); }));
+  MyGame.Example.Monster.startMonster(fbb);
+  MyGame.Example.Monster.addTestarrayofstring(fbb, testarrayofstringOffset);
+  MyGame.Example.Monster.addName(fbb, name);
+  MyGame.Example.Monster.finishMonsterBuffer(fbb, MyGame.Example.Monster.endMonster(fbb));
+  assert.deepEqual(new Buffer(fbb.asUint8Array()), correct);
+}
+
 main();
index 40dba2b..3d31007 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/sh
 
 pushd "$(dirname $0)" >/dev/null
-test_dir="$(pwd)"
-node ${test_dir}/JavaScriptTest
+../flatc -b monster_test.fbs unicode_test.json
+node JavaScriptTest
diff --git a/tests/unicode_test.json b/tests/unicode_test.json
new file mode 100644 (file)
index 0000000..a78fdf0
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "name": "unicode_test",
+  "testarrayofstring": [
+    "Цлїςσδε",
+    "フムアムカモケモ",
+    "フムヤムカモケモ",
+    "㊀㊁㊂㊃㊄",
+    "☳☶☲",
+    "𡇙𝌆"
+  ]
+}