コード例 #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    = Encoding.Unicode;
                    com2.Encoding    = 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, actualChars, 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, actualChars, result);
                    result = com1.Read(actualChars, actualChars.Length - 2, 2);

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