From 64bdde9a058cda478b3a166da34ba5ffcf7ad24a Mon Sep 17 00:00:00 2001 From: Curran Date: Sat, 31 Dec 2022 15:21:55 -0500 Subject: [PATCH 1/2] Add tests for emojis --- test/index.test.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/test/index.test.js b/test/index.test.js index 7aec68b..098c426 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -290,6 +290,52 @@ describe("Jsondiff", function() { ]; runTests(tests); }); + describe("Emoji", function() { + let tests = [ + { + name: "Emoji replacement", + start: { one: "1234abcdef" }, + end: { one: "1234😃bcdef" }, + expectedCommand: [ + { sd: 'a', p: [ 'one', 4 ] }, + { si: '😃', p: [ 'one', 4 ] } + ] + }, + { + name: "Emoji insertion", + start: { one: "1234abcdef" }, + end: { one: "1234😃abcdef" }, + expectedCommand: [ + { si: '😃', p: [ 'one', 4 ] } + ] + }, + { + name: "Emoji deletion", + start: { one: "1234😃abcdef" }, + end: { one: "1234abcdef" }, + expectedCommand: [ + { sd: '😃', p: [ 'one', 4 ] } + ] + }, + { + name: "Multiple emoji insertion", + start: { one: "1234abcdef" }, + end: { one: "1234😃😃abcdef" }, + expectedCommand: [ + { si: '😃😃', p: [ 'one', 4 ] } + ] + }, + { + name: "Multiple emoji deletion", + start: { one: "1234😃😃abcdef" }, + end: { one: "1234abcdef" }, + expectedCommand: [ + { sd: '😃😃', p: [ 'one', 4 ] } + ] + }, + ]; + runTests(tests); + }); }); describe("JSON1", function () { describe("Reversible remove", function () { From 76e6da68faeb4244ac8ba8c466e5b5529785bb9a Mon Sep 17 00:00:00 2001 From: Curran Date: Mon, 28 Jul 2025 17:01:07 -0400 Subject: [PATCH 2/2] Add failing test cases --- test/index.test.js | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/test/index.test.js b/test/index.test.js index 098c426..af71b21 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -333,6 +333,102 @@ describe("Jsondiff", function() { { sd: '😃😃', p: [ 'one', 4 ] } ] }, + { + name: "Complex emoji replacement", + start: { one: "Hello👋World" }, + end: { one: "Hello🌍World" }, + expectedCommand: [ + { sd: '👋', p: [ 'one', 5 ] }, + { si: '🌍', p: [ 'one', 5 ] } + ] + }, + { + name: "Multi-codepoint emoji insertion", + start: { one: "text" }, + end: { one: "text👨‍💻" }, + expectedCommand: [ + { si: '👨‍💻', p: [ 'one', 4 ] } + ] + }, + { + name: "Multi-codepoint emoji deletion", + start: { one: "text👨‍💻more" }, + end: { one: "textmore" }, + expectedCommand: [ + { sd: '👨‍💻', p: [ 'one', 4 ] } + ] + }, + { + name: "Skin tone modifier emoji insertion", + start: { one: "wave👋" }, + end: { one: "wave👋🏽" }, + expectedCommand: [ + { si: '🏽', p: [ 'one', 6 ] } + ] + }, + { + name: "Flag emoji replacement", + start: { one: "Country🇺🇸flag" }, + end: { one: "Country🇬🇧flag" }, + expectedCommand: [ + { sd: '🇺🇸', p: [ 'one', 7 ] }, + { si: '🇬🇧', p: [ 'one', 7 ] } + ] + }, + { + name: "Mixed Unicode characters", + start: { one: "café🍕naïve" }, + end: { one: "café🌮naïve" }, + expectedCommand: [ + { sd: '🍕', p: [ 'one', 4 ] }, + { si: '🌮', p: [ 'one', 4 ] } + ] + }, + { + name: "Emoji sequence with ZWJ", + start: { one: "family👨‍👩‍👧‍👦end" }, + end: { one: "family👨‍👩‍👧end" }, + expectedCommand: [ + { sd: '👨‍👩‍👧‍👦', p: [ 'one', 6 ] }, + { si: '👨‍👩‍👧', p: [ 'one', 6 ] } + ] + }, + { + name: "Mathematical symbols", + start: { one: "equation∑∞" }, + end: { one: "equation∫∞" }, + expectedCommand: [ + { sd: '∑', p: [ 'one', 8 ] }, + { si: '∫', p: [ 'one', 8 ] } + ] + }, + { + name: "CJK characters", + start: { one: "hello世界" }, + end: { one: "hello世間" }, + expectedCommand: [ + { sd: '界', p: [ 'one', 6 ] }, + { si: '間', p: [ 'one', 6 ] } + ] + }, + { + name: "Combining diacritical marks", + start: { one: "café" }, + end: { one: "cafe\u0301" }, + expectedCommand: [ + { sd: 'é', p: [ 'one', 3 ] }, + { si: 'e\u0301', p: [ 'one', 3 ] } + ] + }, + { + name: "Regional indicator symbols", + start: { one: "🇺🇸🇬🇧🇫🇷" }, + end: { one: "🇺🇸🇩🇪🇫🇷" }, + expectedCommand: [ + { sd: '🇬🇧', p: [ 'one', 2 ] }, + { si: '🇩🇪', p: [ 'one', 2 ] } + ] + }, ]; runTests(tests); });