diff --git a/README.md b/README.md new file mode 100644 index 0000000..6d05933 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +## Юниттесты для INSTEAD + +Здесь я пытаюсь сделать юнит-тест простой игры. Чтобы его запустить, откройте папку `unittest` как игру в SDL-INSTEAD. + +Тестовая игра содержит простой пазл "ключ-замок", но приближенный к реальным паззлам: + +##### Несколько вариантов решений +К замку должно подходить два разных ключа двумя разными способами. (В идеале каждый из этих ключей должен использоваться ещё где-то, но это уже усложнение.) + +Это же не даёт использовать свойство `with_key`. + +##### Замок нельзя закрыть +Замок нельзя закрыть, после того как вы его открыли. Игрок не сможет случайно вернуть загадку после того, как её решил. + +##### Единственный способ автотестов - это юнит-тест + +Два пункта выше делают стандартный автоскрипт инстеда неприменимым: он может проверить только одно решение за раз и не сможет закрыть замок, чтобы попытаться по-другому. Нужно сооружать юнит-тесты. diff --git a/main3.lua b/main3.lua index bcdd0f5..8a601a4 100644 --- a/main3.lua +++ b/main3.lua @@ -35,7 +35,8 @@ obj { description = 'Карандаш, которым нельзя открывать замки.'; found_in = 'main'; } - +-- действие "писать карандашом на бумажке" не входит в тестируемые +-- и требует нового глагола, но оно было бы в реальной игре obj { -"замок/мр"; @@ -45,6 +46,7 @@ obj { -- замок можно открыть двумя вещами, поэтому with_key не уместен -- вместо этого надо перехватывать before_Unlock -- кроме того, его хочется сразу открывать, потому что зачем ещё мы его отпираем + before_Lock = 'Замок полезнее открытым.'; before_Unlock = function(self, what) if (what == nil) then return false diff --git a/unittest/main3.lua b/unittest/main3.lua index 404161a..c0f3eeb 100644 --- a/unittest/main3.lua +++ b/unittest/main3.lua @@ -40,6 +40,12 @@ game.timer = function(s) expect(lock:has('locked')).to.be(true) end) + it('склонения', function() + expect(mp.fmt('{#me}')).to.be('ты') + expect(mp.fmt('{#me/вн}')).to.be('тебя') + expect(_('lock'):noun('дт')).to.be('замку') + end); + it('открывание', function() std.call(mp, 'input:text', 'открыть замок') local lock = _('lock');