Пример #1
0
    public void Read_SurrogateBoundary()
    {
        using (SerialPort com1 = TCSupport.InitFirstSerialPort())
            using (SerialPort com2 = TCSupport.InitSecondSerialPort(com1))
            {
                char[] charXmitBuffer = new char[32];

                int result;

                Debug.WriteLine("Verifying that Read(char[], int, int) works with reading surrogate characters");

                TCSupport.GetRandomChars(charXmitBuffer, 0, charXmitBuffer.Length - 2, TCSupport.CharacterOptions.Surrogates);
                charXmitBuffer[charXmitBuffer.Length - 2] = TCSupport.GenerateRandomHighSurrogate();
                charXmitBuffer[charXmitBuffer.Length - 1] = TCSupport.GenerateRandomLowSurrogate();

                com1.Encoding    = System.Text.Encoding.Unicode;
                com2.Encoding    = System.Text.Encoding.Unicode;
                com1.ReadTimeout = 500;

                com1.Open();

                if (!com2.IsOpen) //This is necessary since com1 and com2 might be the same port if we are using a loopback
                {
                    com2.Open();
                }

                //[] First lets try with buffer size that is larger then what we are asking for
                com2.Write(charXmitBuffer, 0, charXmitBuffer.Length);
                TCSupport.WaitForExpected(() => com1.BytesToRead, charXmitBuffer.Length * 2,
                                          5000, "Err_018158ajid BytesToRead");

                var charRcvBuffer = new char[charXmitBuffer.Length];

                result = com1.Read(charRcvBuffer, 0, charXmitBuffer.Length - 1);

                Assert.Equal(charXmitBuffer.Length - 2, result);

                char[] actualChars = new char[charXmitBuffer.Length];

                Array.Copy(charRcvBuffer, 0, actualChars, 0, result);
                result = com1.Read(actualChars, actualChars.Length - 2, 2);

                Assert.Equal(2, result);
                Assert.Equal(charXmitBuffer, actualChars);

                //[] Next lets try with buffer size that is the same size as what we are asking for
                com2.Write(charXmitBuffer, 0, charXmitBuffer.Length);
                TCSupport.WaitForExpected(() => com1.BytesToRead, charXmitBuffer.Length * 2,
                                          5000, "Err_018158ajid BytesToRead");

                charRcvBuffer = new char[charXmitBuffer.Length - 1];

                result = com1.Read(charRcvBuffer, 0, charXmitBuffer.Length - 1);

                Assert.Equal(charXmitBuffer.Length - 2, result);

                actualChars = new char[charXmitBuffer.Length];

                Array.Copy(charRcvBuffer, 0, actualChars, 0, result);
                result = com1.Read(actualChars, actualChars.Length - 2, 2);

                Assert.Equal(2, result);
                Assert.Equal(charXmitBuffer, actualChars);
            }
    }