Pex и Unicode кодирование - PullRequest
       8

Pex и Unicode кодирование

1 голос
/ 15 ноября 2011

Я играю с Pex и у меня простой класс.Код:

public void WriteLine(string line)
{
    Contract.Requires(line != null);
    if (_stream == null)
        _stream = getStream();

    var writer = new StreamWriter(_stream);
    writer.WriteLine(line);
}

private Stream getStream()
{
    return File.Open(Path, FileMode.Append, FileAccess.Write);
}

Я создал следующее PexMethod:

[PexMethod(MaxRunsWithoutNewTests = 200)]
public void WriteLine(string line)
{
    var ms = new MemoryStream();

    MFile.BehaveAsNotImplemented();
    MFileStream.BehaveAsNotImplemented();
    MStreamWriter.BehaveAsNotImplemented( );

    MFile.OpenStringFileModeFileAccess = (p, m, a) => new FileStream(p, m);
    MFileStream.ConstructorStringFileMode = (s, p, m) => new StreamWriter(ms);
    MStreamWriter.AllInstances.BaseStreamGet = sw => ms;
    MStreamWriter.ConstructorStream = (sw, s) =>
    {
        ;
    };
    MTextWriter.AllInstances.WriteLineString = (tw, l) =>
    {
        var buf = Encoding.Unicode.GetBytes(line);
        ms.Write(buf, 0, buf.Length);
     };

     var path = "C:\test.txt";
     var target = new FileWriter(path);
     target.WriteLine(line);

     var buffer = ms.ToArray();
     var result = Encoding.Unicode.GetString(buffer);
     PexAssert.AreEqual<string>(line, result);
}

Pex Exploration придумал этот модульный тест:

[TestMethod]
[PexGeneratedBy(typeof(FileWriterTest))]
[PexRaisedException(typeof(PexAssertFailedException))]
[HostType("Moles")]
public void WriteLineThrowsPexAssertFailedException25()
{
    this.WriteLine("\udc00");
}

странно то, что как только стек выходит из модульного теста с помощью udc00 и входит в параметризованный тест, строка параметров представляется следующим образом: '�'

Как вы можете видеть, я выполняю всю буферизацию с Unicode,Когда я, наконец, пытаюсь прочитать строку из потока памяти, я получаю странный символ, который выглядит как ромб с вопросительным знаком внутри.

Там я получаю сообщение об ошибке: «PexAssertFailedException», получил '�' "

Кто-нибудь знает, что происходит?

1 Ответ

0 голосов
/ 15 ноября 2011

Encoding.Unicode - это UTF-16 и вообще не может представлять суррогатные пары (от U + D800 до U + DFFF).При попытке их заменить символом «Символ замены» (U + FFFD).

Удивительно, но .NET может хранить суррогатные пары в строках.Поэтому, когда вы кодируете, а затем декодируете символ, он больше не будет соответствовать исходной строке.

...