2009-05-25 4 views
1

동일한 문자열을 생성하지만 Assert.AreEqual이 실패한 다음 테스트가 있습니다.Assert.AreEqual은 예상치와 실제 값이 같아도 실패합니다.

[TestMethod] 
public void Decompressed_test_should_equal_to_text_before_compression() 
{ 
    TextCompressor compressor = new TextCompressor(); 
    Random r = new Random((int)DateTime.Now.Ticks); 

    for (int i = 500; i < 1500; i++) 
    { 
     char[] testArray = new char[i]; 

     for (int j = 0; j < i; j++) 
     {      
      char randomChar = (char)(r.Next(256, 65536)); 
      testArray[j] = randomChar; 
     } 
     string testString = new String(testArray); 
     string compressed = compressor.Compress(testString); 
     string decompressed = compressor.Decompress(compressed); 

     Assert.AreEqual(testString.Length, decompressed.Length); 
     Assert.AreEqual(testString, decompressed, false, CultureInfo.InvariantCulture); 
    } 
} 

compressor.Compress 및 compressor.Decompress GZipStream 일부는 압축 및 압축 해제한다.

(65, 90) 대신 (256, 65536)을 시도하면 유니 코드와 관련이 있다고 생각합니다. 나는 InvariantCulture 대신에 CurrentCulture와 문화를 전혀 사용하지 않았고 여전히 실패했다. 그러나 결과 문자열은 동일하게 나타납니다

Assert.AreEqual에 실패했습니다.

예상 :

< ☔ ฺ 疉 鎷 얚 ᧏ 跨 꿌 沩 얫 嘹 ֨ ز 항 們 嵜 浮 䑹 شم 靄  斳 薃 픢 萁 ⯬ 쫎 ʛ⫕ 蝺 ꄗ 穌 넢  뇌 䶆멊 큀퉆  䐫 ̥ 괊 ⑆ 놸  僥 ̅ᵀ 㣚 ꢅ 뺓 䇚 녚 伀 讍 홬 䈕 캾 撏 Ჴ 孢 黮 摠 뮡  䌦 윃 ᬳ 狚 䆙 툾훶 䏤 ꛈṻ⟧㉖ 鮸 蒵 萗 냤 퇅서 㪨 瀲 鰪残 䓴 ۇ 넃 櫜 㑦 䢻 쮓죣 䕱 䶘 㴝 姳 뿝 嘼 ᷨ 㗬 꺬  櫣 涷 ꠶ 浒 껅 က 㷕 䩉  毎 覛 ⧹ 䮯 嬇 힚 艐 Ὑ 쇕횻 鸙 蹻 硐  䈆 쓖 ⸛ 錼 鰙 ኰ乒 ֐ ⺴ 썓힠 䵓 ꅄ ⵈ 桃 怅 㾈 枟 ⏠ه 폫 ا 琖 ퟰ 乼  쩐 鑈 푷 ᫇﯎ 蕱 늛  쭡 䙠 ⲓ ᒇꪮ 툅 ⃑ꦴ 돻 ♹ᢋ 麝 熪 뚭 Ћ 䌚 娯 钮 ⡃ 㪿ㅞ ⤩ 㥍 㥍 磛 蚾 ㅸ 擫 떦 蝳 鰽 䠺 ꭍ 튘폻 ⥽ⳉ ⹼ 驿 똮 ⯴⋟Ḋ ᛼ ꣜ 墭 䐣 앾 ᵸᮄ ᵸᮄ 杗 奪烑 烑 鄗 䳘 溴 溴 墽 炁 栥 栥 풼 ಃ 狹 狹 쵎 쵎 ⃺ 瀃 碂 밎 崹 䎐 ஛ 汫 踖 뢸 숥퍞 숥퍞 䱅 䵱 꽔븽 䢴 ꁅ⟼  ꁅ⟼  癸 ꩽ 靔 䚝 䚝! ⩏￸ 鍁 Ꮨ䷇ 쁐쨒 ʊ 쪦 鄭 借 滋 铆 ᮉ 嚃 ᩨ⶝ ိ  펇 ꮼ 뇄」ᰉ 㕾 枒 鯅 蛺  䠿 櫄 築 픆 车 똅렬 ㈆ّ Ἃ 荞 괋  랆 偦 뤰 䝷 핸 ⹝ 屑 素 蝨怀 猔 勛 碉 퀪 睹 Ⓥ 䍙 ಗ 䤮  뾿 谢 ꁼ 戻 ڳ ᆯ콧 偪 ز 븭 碇 쮢 籍 ⁜ 왋 壝 駡 暷 샖 ଄ࣵ 艫 ᜝ 䃴 厫 ​​ᢉ 慨 䁆 ꂴ ೉ 溘 欋 옭 螶 䦗跠 﨔 膉 痹 邘 ⋫ 吪 멚 埣 ꯕ 扌 옘 广  犵 肖  㶕 畅 몡 ↇ꠫ 픧 ၥ 帻 놤 惘 惘 똞 糴 쫼 鿋 䬝   ⺁ 峁 踷 锝   鰀 嗊 ⹀ ⹀  遲 䩢 푑팾 糔 뭯 ዇ࣷ䷴ 䬾 ⶵ 틩 魨 㵻 恬 ҅ ᣄⲪ 豩 뛌 ꛵ 㥨 몙 몙 〼 ⏮ 큤 亃 ꢡ 웼 ఐ 뻻펂 㢓 㢓 䂃 䂃 䨠 䕱>.

실제 :

< ☔ ฺ 疉 鎷 얚 ᧏ 跨 꿌 沩 얫 嘹 ֨ ز 항 們 嵜 浮 䑹 شم 靄  斳 薃 픢 萁 ⯬ 쫎 ʛ⫕ 蝺 ꄗ 穌 넢  뇌 䶆멊 큀퉆  䐫 ̥ 괊 ⑆ 놸  僥 ̅ᵀ 㣚 ꢅ 뺓 䇚 녚 伀 讍 홬 䈕 캾 撏 Ჴ 孢 黮 摠 뮡  䌦 윃 ᬳ 狚 䆙 툾훶 䏤 ꛈṻ⟧㉖ 鮸 蒵 萗 냤 퇅서 㪨 瀲 鰪残 䓴 ۇ 넃 櫜 㑦 䢻 쮓죣 䕱 䶘 㴝 姳 뿝 嘼 ᷨ 㗬 꺬  櫣 涷 ꠶ 浒 껅 က 㷕 䩉  毎 覛 ⧹ 䮯 嬇 힚 艐 Ὑ 쇕횻 鸙 蹻 硐  䈆 쓖 ⸛ 錼 鰙 ኰ乒 ֐ ⺴ 썓힠 䵓 ꅄ ⵈ 桃 怅 㾈 枟 ⏠ه 폫 ا 琖 ퟰ 乼  쩐 鑈 푷 ᫇﯎ 蕱 늛  쭡 䙠 ⲓ ᒇꪮ 툅 ⃑ꦴ 돻 ♹ᢋ 麝 熪 뚭 Ћ 䌚 娯 钮 ⡃ 㪿ㅞ ⤩ 㥍 㥍 磛 蚾 ㅸ 擫 떦 蝳 鰽 䠺 튘폻 튘폻 ⥽ⳉ ⹼ 驿 똮 ⯴⋟Ḋ 룴 ꣜ 墭 䐣 앾 ᵸᮄ ᵸᮄ 杗 奪 騑烑 烑 鄗 䳘 溴 溴 墽 炁 栥 栥 풼 ಃ 狹 狹 쵎 쵎 ⃺ 瀃 碂 밎 崹 䎐 ஛ 汫 踖 뢸 숥퍞 숥퍞 䱅 䵱 꽔븽 䢴 ꁅ⟼  ꁅ⟼  癸 ꩽ 靔 䚝 䚝! ⩏￸ 鍁 Ꮨ䷇ 쁐쨒 ʊ 쪦 鄭 借 滋 铆 ᮉ 嚃 ᩨ⶝ ိ  펇 ꮼ 뇄」ᰉ 㕾 枒 鯅 蛺  䠿 櫄 築 픆 车 똅렬 ㈆ّ Ἃ 荞 괋  랆 偦 뤰 䝷 핸 ⹝ 屑 素 蝨怀 猔 勛 碉 퀪 睹 Ⓥ 䍙 ಗ 䤮  뾿 谢 ꁼ 戻 ڳ ᆯ콧 偪 ز 븭 碇 쮢 籍 ⁜ 왋 壝 駡 暷 샖 ଄ࣵ 艫 ᜝ 䃴 厫 ​​ᢉ 慨 䁆 ꂴ ೉ 溘 欋 옭 螶 䦗跠 﨔 膉 痹 邘 ⋫ 吪 멚 埣 ꯕ 扌 옘 广  犵 肖  㶕 畅 몡 ↇ꠫ 픧 ၥ 帻 놤 惘 惘 똞 糴 쫼 鿋 䬝   ⺁ 峁 踷 锝   鰀 嗊 ⹀ ⹀  遲 䩢 푑팾 糔 뭯 ዇ࣷ䷴ 䬾 갭 ⶵ 틩 魨 㵻 恬 ҅ པ ᣄⲪ 豩 뛌 ꛵ 㥨 몙 〼 △ ⏮ 큤 亃 ꢡ 웼 ఐ 칇 뻻펂 㢓 吋 䂃 䨠 䕱>.

무엇이 누락 되었습니까?

+3

와우. 그 두 문자열이 한 눈에 똑같은지 아닌지는 분명하지 않습니다. –

+0

AreEqual은 실패합니까? –

+0

@Stefan, 두 번째. –

답변

2

(char)(r.Next(256, 65536))은 잘못된 문자 조합을 생성하여 불법 텍스트가 될 수 있으므로 시험 내용을 만드는 데 사용할 수 없습니다. 이는 형 변환이 유효하고 유효한 문자가 생성 된 경우에도 발생할 수 있습니다. 하나의 예는 U + D800에서 U + DFFF까지의 surrogate이지만, 아마도 다른 것이있을 수 있습니다.

모든 유니 코드 범위에서 샘플 텍스트를 생성하려는 경우 유니 코드를 만들 때 인식해야하며 무작위를 char으로 캐스팅하지 않아야합니다. (난 당신이 임의의 숫자에 대한 더 좁은 범위를 제공 할 때 근무하는 질문에 명시된 때이 떠올랐다 생각합니다.)

+0

네가 맞다. 내가 손으로 만든 캐릭터를 대신 사용했을 때, 효과가 있었다. 감사. –

+1

나는 확신하지 못한다! "(char) (r.Next (256, 65536)) 잘못된 문자가 생성 될 수 있습니다." 방법 것입니다? * char * docs say (U + 0000 - U + ffff -> Unicode 16-bit character) –

+0

@bruno 범위의 U + 55296에서 U + 57343을 피하면됩니다. 케이스. – hoang

1

byte이 아닌 char을 사용하십시오.

Compress/Decompress 메서드는 배열을 가져야하며, 호출 할 때마다 유니 코드 데이터를 읽고 호출하기 전에 변환해야합니다.

.NET 2.0 이상에는 GZipStream 클래스가 포함되어 있습니다.

+0

눈치 챘 겠지만 문자열 초기화에만 char 배열을 사용하고 있습니다. 압축 및 압축 해제 메소드는 문자와 함께 작동하지 않습니다. 내부적으로 바이트 배열을 사용합니다. –

+0

텍스트는 byte []가 아닌 char []입니다. Byte []는 내부적으로 만 사용해야합니다 *. 그래서 나는 그것이 시험 방법에 사용되어야한다는 것에 동의하지 않는다. – bzlm

+0

@buyutec : 이러한 메서드 구현을 볼 수 없기 때문에 내부적으로 바이트 배열을 사용한다는 것을 알기가 어렵습니다. –

1

몇 가지 실험을 제작 :

string testString = new String(testArray); 
string anotherString = new String(testArray); 
Assert.AreEqual(testString.Length, anotherString.Length); 
Assert.AreEqual(testString, anotherString, false, CultureInfo.InvariantCulture); 

이 압축하지 않고있다. 그것은 잘 작동합니다.당신이 임의의 값 (NO "가끔 작품"문제)가 없습니다,

for (int i = 256; i < 65536; i++) 
{ 
    string testString = new String((char)(i), 2); 

    string compressed = compressor.Compress(testString); 
    string decompressed = compressor.Decompress(compressed); 

    Assert.AreEqual(testString.Length, decompressed.Length); 
    Assert.AreEqual(testString, decompressed, false, CultureInfo.InvariantCulture); 
} 

이 한 번에 정확히 하나 개의 문자를 테스트하고 당신은거야 :

난 당신이 당신의 테스트를 변경하는 것이 좋습니다 특정 종류의 문자가 작동하지 않는지 확인하십시오.

0

나는 암호화/복호화에 대해 동일한 테스트를 거쳤습니다. 이분법을 사용하여

, 내가 발견 한 그 범위 내에서 유니 코드 문자 U는 55,296에에게 U는 + 57,343 그래서

가장 넓은 범위를 Assert.AreEqual

를 사용하여 실패 할 것이다 당신이 사용할 수있는 +는 "서로 게이트 코드 포인트"를 포함하는 모든 문자열 위치 :

char randomChar = (char)(r.Next(0, 55295)); 

char randomChar = (char)(r.Next(57344, 65535)); 
관련 문제