Browse Source

Fixes #2646. CharacterMap scenario is throwing exception with surrogate code points. (#2648)

* Fixes #2646. CharacterMap scenario is throwing exception with surrogate code points.

* Add "low surrogate" in unit test.
BDisp 2 years ago
parent
commit
5eed00e8f5

+ 6 - 2
UICatalog/Scenarios/CharacterMap.cs

@@ -403,8 +403,12 @@ class CharMap : ScrollView {
 				if (cursorRow + ContentOffset.Y + 1 == y && cursorCol + ContentOffset.X + firstColumnX + 1 == x && !HasFocus) {
 				if (cursorRow + ContentOffset.Y + 1 == y && cursorCol + ContentOffset.X + firstColumnX + 1 == x && !HasFocus) {
 					Driver.SetAttribute (GetFocusColor ());
 					Driver.SetAttribute (GetFocusColor ());
 				}
 				}
-				
-				Driver.AddRune (new Rune (val + col));
+
+				if (char.IsSurrogate ((char)(val + col))) {
+					Driver.AddRune (Rune.ReplacementChar);
+				} else {
+					Driver.AddRune (new Rune (val + col));
+				}
 
 
 				if (cursorRow + ContentOffset.Y + 1 == y && cursorCol + ContentOffset.X + firstColumnX + 1 == x && !HasFocus) {
 				if (cursorRow + ContentOffset.Y + 1 == y && cursorCol + ContentOffset.X + firstColumnX + 1 == x && !HasFocus) {
 					Driver.SetAttribute (GetNormalColor ());
 					Driver.SetAttribute (GetNormalColor ());

+ 3 - 2
UnitTests/Configuration/RuneJsonConverterTests.cs

@@ -26,7 +26,7 @@ public class RunJsonConverterTests {
 		// Act
 		// Act
 		var json = JsonSerializer.Serialize (rune, ConfigurationManager._serializerOptions);
 		var json = JsonSerializer.Serialize (rune, ConfigurationManager._serializerOptions);
 		var deserialized = JsonSerializer.Deserialize<Rune> (json, ConfigurationManager._serializerOptions);
 		var deserialized = JsonSerializer.Deserialize<Rune> (json, ConfigurationManager._serializerOptions);
-		
+
 		// Assert
 		// Assert
 		Assert.Equal (expected, deserialized.ToString ());
 		Assert.Equal (expected, deserialized.ToString ());
 	}
 	}
@@ -39,7 +39,8 @@ public class RunJsonConverterTests {
 	[InlineData ("🍎🍎")]
 	[InlineData ("🍎🍎")]
 	[InlineData ("U+FFF1F34E")]
 	[InlineData ("U+FFF1F34E")]
 	[InlineData ("\\UFFF1F34E")]
 	[InlineData ("\\UFFF1F34E")]
-	[InlineData ("\\ud83d")] // not printable
+	[InlineData ("\\ud83d")] // not printable "high surrogate"
+	[InlineData ("\\udc3d")] // not printable "low surrogate"
 	[InlineData ("\\ud83d \\u1c69")]  // bad surrogate pair
 	[InlineData ("\\ud83d \\u1c69")]  // bad surrogate pair
 	[InlineData ("\\ud83ddc69")]
 	[InlineData ("\\ud83ddc69")]
 	// Emoji - Family Unit:
 	// Emoji - Family Unit: