Фразоперемешиватель

Помните недавний пост про " По рзелульаттам илссеовадний одонго анлигйсокго унвиертисета, не иеемт занчнеия, в кокам пряокде рсапожолены бкувы в солве…"?
Очень меня заинтересовало - правда это или нет, а тут еще захотелось gTest поизучать, так что написал я программку, которая таким вот образом коверкает слова.

И действительно, это правило отлично работает - тексты, исковерканные моей программой, достаточно свободно читаются.

Кому интересно самому поиграться, могут скачать программу тут:
ScrambleStrings.rar - там можно вставить любой текст в верхний EditBox и нажать на "Создать". Получившийся текст можно скопировать в буфер обмена кнопкой "Копировать" и вставить куда хочешь.


gTest оказался жутко удобной библиотекой. Почти не пришлось тратить время на его подключение - только пара ошибок линкования была и та из-за конфликтов с MFC. Использование gTest - это всего 2 строки для старта тестов, причем ими еще и через командную строку можно управлять.
Сами тесты тоже создавать предельно просто (в конце поста будет код - можно заценить).
Я решил написать эту утилитку по правилу "Сначала тест - потом код" и не пожалел. Придумал вначале несколько тестовых случаев, написал их - это помогло продумать интерфейс функции для переворачивания строки, которую я сначала хотел сделать в классе, но оказалось, что гораздо удобнее сделать просто 1 функцию.
Когда тесты готовы - тупо пишешь реализацию, компилируешь, запускаешь тесты, смотришь ошибки и исправляешь.
Когда все заработало в тестах - только тогда запустил саму программу с GUI, она тоже уже сразу заработала :)
На все ушло около 2 часов, из которых около часа - на разборки с MFC и SetClipboardData.
Задачи сделать оптимально по быстродействию не стояло - просто делал быстро и чтобы работало правильно.
Собственно код тестов:
#include "stdafx.h"
#include <gtest/gtest.h>
#include "StringScrambler.h"
TEST(StringScramblerTest, TestNoChangeCases)
{
  std::string testCases[] = {
    "",
    " ",
    "I",
    "In",
    "Ink",
    " I ",
    "I am Ink",
    ".I, ;am:-\’\" ?Ink!",
    " Are you Ink? ",
    "   \n\r\n\n\r\r Are you Ink? I use tab and car ret\n\r",
    " \n\r\n\n\r\r  ",
    "Arrrrrrrrrrrrrrrrrrrrrre"
  };
  for (int i = 0; i < sizeof(testCases)/sizeof(testCases[0]); ++i)
  {
    EXPECT_STREQ(testCases[i].c_str(), StringScrambler::ScrambleString(testCases[i]).c_str());
  }
}
TEST(StringScramblerTest, TestGoodOneWordCases)
{
  std::string testCases[] = {"Перевернул", "Переворот", "Война", "Всегда", "Плохо", "Независимо", "Целей"};
  std::string ret;
  for (int i = 0; i < sizeof(testCases)/sizeof(testCases[0]); ++i)
  {
    ret = StringScrambler::ScrambleString(testCases[i]);
    EXPECT_STRNE(ret.c_str(), testCases[i].c_str());
    assert(ret != testCases[i]);
    EXPECT_EQ(testCases[i][0], ret[0]);
    EXPECT_EQ(testCases[i][testCases[i].length() - 1], ret[ret.length() - 1]);
    EXPECT_EQ(testCases[i].length(), ret.length());
  }
}
TEST(StringScramblerTest, TestSeveralWords)
{
  std::string checkPhraze = "которое попадается им на пути";
  std::string ret = StringScrambler::ScrambleString(checkPhraze);
  EXPECT_STRNE(ret.c_str(), checkPhraze.c_str());
  EXPECT_EQ(checkPhraze[0], ret[0]);
  EXPECT_EQ(checkPhraze[checkPhraze.length() - 1], ret[ret.length() - 1]);
  EXPECT_EQ(checkPhraze.length(), ret.length());
  EXPECT_EQ(checkPhraze[6], ret[6]);
  EXPECT_EQ(checkPhraze[8], ret[8]);
  EXPECT_EQ(checkPhraze[17], ret[17]);
  EXPECT_EQ(checkPhraze[25], ret[25]);
}
TEST(StringScramblerTest, TestSeveralWords2)
{
  std::string checkPhraze = "преувеличение, потому что Грузия не входит в состав Европы";
  std::string ret = StringScrambler::ScrambleString(checkPhraze);
  EXPECT_STRNE(ret.c_str(), checkPhraze.c_str());
  EXPECT_EQ(checkPhraze[0], ret[0]);
  EXPECT_EQ(checkPhraze[checkPhraze.length() - 1], ret[ret.length() - 1]);
  EXPECT_EQ(checkPhraze.length(), ret.length());
  EXPECT_EQ(checkPhraze[12], ret[12]);
  EXPECT_EQ(checkPhraze[15], ret[15]);
  EXPECT_EQ(checkPhraze[20], ret[20]);
  EXPECT_EQ(checkPhraze[26], ret[26]);
  EXPECT_EQ(checkPhraze[31], ret[31]);
  EXPECT_EQ(checkPhraze[36], ret[36]);
}

 Понравилась статья? Подпишись на RSS!

3 комментариев к Фразоперемешиватель

Ответить

 

 

 

Вы можете использовать эти HTML тэги

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>