public static void EncoderExceptionFallbackBufferTest() { Encoder encoder = Encoding.GetEncoding("us-ascii", new EncoderExceptionFallback(), new DecoderExceptionFallback()).GetEncoder(); char [] chars = new char[] { '\uFFFF' }; byte [] bytes = new byte[2]; Assert.Throws <EncoderFallbackException>(() => encoder.GetBytes(chars, 0, 1, bytes, 0, true)); EncoderFallbackBuffer fallbackBuffer = encoder.FallbackBuffer; Assert.True(fallbackBuffer is EncoderExceptionFallbackBuffer, "Expected to get EncoderExceptionFallbackBuffer type"); Assert.Throws <EncoderFallbackException>(() => fallbackBuffer.Fallback(chars[0], 0)); Assert.Throws <EncoderFallbackException>(() => fallbackBuffer.Fallback('\u0040', 0)); Assert.Throws <EncoderFallbackException>(() => fallbackBuffer.Fallback('\uD800', '\uDC00', 0)); Assert.Equal(0, fallbackBuffer.Remaining); Assert.Equal('\u0000', fallbackBuffer.GetNextChar()); Assert.False(fallbackBuffer.MovePrevious(), "MovePrevious expected to always return false"); fallbackBuffer.Reset(); Assert.Equal(0, fallbackBuffer.Remaining); Assert.Equal('\u0000', fallbackBuffer.GetNextChar()); }
public static void EncoderReplacementFallbackBufferTest() { Encoder encoder = Encoding.GetEncoding("us-ascii", new EncoderReplacementFallback(), new DecoderReplacementFallback()).GetEncoder(); char [] chars = new char [] { '\uFFFF' }; byte [] bytes = new byte [2]; EncoderFallbackBuffer fallbackBuffer = encoder.FallbackBuffer; Assert.True(fallbackBuffer is EncoderReplacementFallbackBuffer, "Expected to get EncoderReplacementFallbackBuffer type"); Assert.True(fallbackBuffer.Fallback(chars[0], 0), "Expected we fallback on the given buffer"); Assert.Equal(1, fallbackBuffer.Remaining); Assert.False(fallbackBuffer.MovePrevious(), "Expected we cannot move back on the replacement buffer as we are at the Beginning of the buffer"); Assert.Equal('?', fallbackBuffer.GetNextChar()); Assert.True(fallbackBuffer.MovePrevious(), "Expected we can move back on the replacement buffer"); Assert.Equal('?', fallbackBuffer.GetNextChar()); fallbackBuffer.Reset(); Assert.Equal(0, fallbackBuffer.Remaining); Assert.Equal('\u0000', fallbackBuffer.GetNextChar()); Assert.False(fallbackBuffer.MovePrevious(), "Expected we cannot move back on the replacement buffer as we are rest the buffer"); }
private int GetBytesInternal(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) { var outpos = byteIndex; for (var inpos = charIndex; inpos < (charIndex + charCount); inpos++) { var character = chars[inpos]; var @byte = NOCHAR; var escape = false; if (character < Ucs2ToGsm.Length) { @byte = Ucs2ToGsm[character]; if (@byte == ESCAPE) { escape = true; @byte = Ucs2ToGsmExtended[character]; } } else if (character >= Ucs2GclToGsmBase && character <= Ucs2GclToGsmMax) { escape = true; @byte = Ucs2GclToGsm[character - Ucs2GclToGsmBase]; } else if (character == '\x20AC') // Euro sign. { escape = true; @byte = 0x65; } if (@byte == NOCHAR) { char tmp; EncoderFallbackBuffer.Fallback(character, inpos); while ((tmp = EncoderFallbackBuffer.GetNextChar()) != 0) { if (bytes != null) { bytes[outpos++] = Ucs2ToGsm[tmp]; // FIXME: Character might not be a 7-bit one.. } else { outpos++; } } EncoderFallbackBuffer.Reset(); } else { if (bytes != null) { if (escape) { bytes[outpos++] = ESCAPE; } bytes[outpos++] = @byte; } else { outpos += escape ? 2 : 1; } } } return(outpos - byteIndex); }