Assert.AreEqual завершается ошибкой, даже если ожидаемый и фактический совпадают - PullRequest
1 голос
/ 25 мая 2009

У меня есть следующий тест, который, кажется, производит те же строки, но 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);
    }
}

компрессор. Компрессор и компрессор. Декомпрессия выполняет некоторое сжатие и декомпрессию с помощью GZipStream.

Проходит, если я пытаюсь (65, 90) вместо (256, 65536), поэтому я предполагаю, что это как-то связано с юникодом. Я попробовал CurrentCulture и никакой культуры вообще вместо InvariantCulture, и он все еще терпит неудачу. Но получающиеся строки выглядят одинаково:

Ошибка Assert.AreEqual.

Ожидаемый:

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

Фактический:

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

Чего мне не хватает?

Ответы [ 4 ]

2 голосов
/ 25 мая 2009

(char)(r.Next(256, 65536)) может создавать недопустимые комбинации символов, что приводит к появлению недопустимого текста, поэтому его нельзя использовать для создания тестового содержимого. Это может произойти, даже если приведение является действительным, и создается действительный символ. Один пример - это суррогаты от U + D800 до U + DFFF, но, возможно, есть и другие.

Если вы хотите создать образец текста из всех диапазонов Юникода, вы должны быть осведомлены о Юникоде при его создании, а не просто приводить случайное значение к char. (Я думаю, что вы столкнулись с этим, когда указали в вопросе, что это сработало, когда вы указали более узкий диапазон для случайного числа.)

1 голос
/ 25 мая 2009

Провёл несколько экспериментов:

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

Это без сжатия. Работает нормально.

Я предлагаю вам изменить свой тест на это:

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

Это тестирует ровно один символ за раз, у вас нет случайных значений (нет проблемы "иногда работает"), и вы увидите, есть ли определенный тип символов, который не работает.

1 голос
/ 25 мая 2009

Используйте byte, а не char.

Ваши Compress/Decompress методы должны принимать массив byte[], и все, что их вызывает, должно читать ваши данные Unicode и переводить их перед вызовом.

Вам известно, что .NET 2.0 и выше содержит класс GZipStream ?

0 голосов
/ 28 сентября 2011

У меня такой же тест на шифрование / дешифрование.

Используя дихотомию, я обнаружил, что любая строка, содержащая «Суррогатные кодовые точки», то есть символы Юникода в диапазоне от U + 55296 до U + 57343, не будет работать при использовании Assert.AreEqual

поэтому самые широкие диапазоны, которые вы можете использовать:

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

и

char randomChar = (char)(r.Next(57344, 65535));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...