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); } }