diff --git a/test/index.test.js b/test/index.test.js index 7aec68b..af71b21 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -290,6 +290,148 @@ 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 ] } + ] + }, + { + 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); + }); }); describe("JSON1", function () { describe("Reversible remove", function () {