2011-11-14 5 views
1

私は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を作成しました:奇妙なことは、すぐにスタックの葉のように、ある

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

[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は、このユニットテストを思い付いユニットテストをudc00で行い、パラメータ化されたテストに入ると、param Lineは ' 'で表されます。

ご覧のとおり、私はすべてのバッファリングをUnicodeでやっています。私が最後にメモリストリームから文字列を読み込もうとすると、内部に疑問符がついたダイヤモンドのような奇妙なシンボルができます。私が手

ありエラーは、次のとおりです。「PexAssertFailedException」「期待 『奇妙な記号が』、 『だ』」

、誰もが何が起こっているのか知っていますか?

答えて

0

Encoding.UnicodeはUTF-16であり、サロゲートペア(U + D800からU + DFFF)を一切表すことはできません。試してみると、 "置換文字" - 文字(U + FFFD)に置き換えられます。

驚いたことに、.NETはサロゲートペアを文字列に格納できます。したがって、エンコードして後でデコードすると、元の文字列と一致しなくなります。

+0

Pexの調査でサロゲートペアの提案と使用を停止するにはどうすればよいですか? – Chris

+0

私は知らない。 –

+1

このshoudの仕事:PexAssume.IsFalse(stringVariable.ToCharArray().Any(c => char.IsSurrogatePair()); – Chris

関連する問題