1 //
2 // EncodingTester.cs
3 //
4 // Author:
5 //	Marcos Henrich  <marcos.henrich@xamarin.com>
6 //
7 // (C) 2014 Xamarin, Inc.
8 //
9 
10 using NUnit.Framework;
11 using System;
12 using System.Collections.Generic;
13 using System.Text;
14 
15 namespace MonoTests.System.Text
16 {
17 	class EncodingTester
18 	{
19 		class DecoderTestFallbackBuffer : DecoderFallbackBuffer
20 		{
21 			DecoderFallbackBuffer buffer;
22 			private FallbackDelegate fallbackAction;
23 
DecoderTestFallbackBuffer(DecoderReplacementFallback fallback, FallbackDelegate fallbackAction)24 			public DecoderTestFallbackBuffer (DecoderReplacementFallback fallback, FallbackDelegate fallbackAction)
25 			{
26 				this.fallbackAction = fallbackAction;
27 				buffer = new DecoderReplacementFallbackBuffer (fallback);
28 			}
29 
Fallback(byte [] bytesUnknown, int index)30 			public override bool Fallback (byte [] bytesUnknown, int index)
31 			{
32 				fallbackAction (bytesUnknown, index);
33 				return buffer.Fallback (bytesUnknown, index);
34 			}
35 
GetNextChar()36 			public override char GetNextChar ()
37 			{
38 				return buffer.GetNextChar ();
39 			}
40 
MovePrevious()41 			public override bool MovePrevious ()
42 			{
43 				return buffer.MovePrevious ();
44 			}
45 
46 			public override int Remaining
47 			{
48 				get { return buffer.Remaining; }
49 			}
50 
Reset()51 			public override void Reset ()
52 			{
53 				buffer.Reset ();
54 			}
55 		}
56 
57 		class DecoderTestFallback : DecoderFallback
58 		{
59 			private DecoderReplacementFallback fallback;
60 			private FallbackDelegate fallbackAction;
61 
DecoderTestFallback(FallbackDelegate fallbackAction)62 			public DecoderTestFallback (FallbackDelegate fallbackAction)
63 			{
64 				this.fallbackAction = fallbackAction;
65 			}
66 
CreateFallbackBuffer()67 			public override DecoderFallbackBuffer CreateFallbackBuffer ()
68 			{
69 				fallback = new DecoderReplacementFallback ();
70 				return new DecoderTestFallbackBuffer (fallback, fallbackAction);
71 			}
72 
73 			public override int MaxCharCount
74 			{
75 				get { return fallback.MaxCharCount; }
76 			}
77 		}
78 
FallbackDelegate(byte [] bytesUnknown, int index)79 		public delegate void FallbackDelegate (byte [] bytesUnknown, int index);
80 
81 		Encoding encoding;
82 
83 		byte [][] expectedUnknownBytes;
84 		int expectedUnknownBytesIndex;
85 
EncodingTester(string encodingName)86 		public EncodingTester (string encodingName)
87 		{
88 			var decoderFallback = new DecoderTestFallback (this.DecoderFallback);
89 			encoding = Encoding.GetEncoding (encodingName, new EncoderReplacementFallback(), decoderFallback);
90 		}
91 
DecoderFallback(byte [] bytesUnknown, int index)92 		private void DecoderFallback (byte [] bytesUnknown, int index)
93 		{
94 			if (expectedUnknownBytesIndex == expectedUnknownBytes.Length)
95 				expectedUnknownBytesIndex = 0;
96 
97 			var expectedBytes = expectedUnknownBytes [expectedUnknownBytesIndex++];
98 			Assert.AreEqual (expectedBytes, bytesUnknown);
99 		}
100 
TestDecoderFallback(byte [] data, string expectedString, params byte [][] expectedUnknownBytes)101 		public void TestDecoderFallback (byte [] data, string expectedString,  params byte [][] expectedUnknownBytes)
102 		{
103 			lock (this)
104 			{
105 				this.expectedUnknownBytes = expectedUnknownBytes;
106 				this.expectedUnknownBytesIndex = 0;
107 
108 				Assert.AreEqual (expectedString.Length, encoding.GetCharCount (data));
109 				Assert.AreEqual (expectedUnknownBytesIndex, expectedUnknownBytes.Length);
110 
111 				Assert.AreEqual (expectedString, encoding.GetString (data));
112 				Assert.AreEqual (expectedUnknownBytesIndex, expectedUnknownBytes.Length);
113 			}
114 		}
115 	}
116 }