163 lines
4.3 KiB
C++
163 lines
4.3 KiB
C++
#include "gtest/gtest.h"
|
|
#include "CommandMap.h"
|
|
#include <cstring>
|
|
#include <vector>
|
|
|
|
std::shared_ptr<CommandMap> build()
|
|
{
|
|
auto dcm = std::make_shared<CommandMap>();
|
|
dcm->add("iw", 1, nullptr, false);
|
|
dcm->add("f", 2, nullptr, true);
|
|
auto cm = std::make_shared<CommandMap>();
|
|
cm->add("dd", 1, nullptr, false);
|
|
cm->add("f", 2, nullptr, true);
|
|
cm->add("d", 3, dcm, false);
|
|
return cm;
|
|
}
|
|
|
|
uint8_t lookup_command(std::shared_ptr<CommandMap> cm, const char * s, Command & command)
|
|
{
|
|
std::vector<uint32_t> v;
|
|
while (*s)
|
|
{
|
|
v.push_back(*s);
|
|
s++;
|
|
}
|
|
return cm->lookup_command(&v[0], v.size(), command);
|
|
}
|
|
|
|
TEST(CommandMapTest, add_does_nothing_for_empty_sequence)
|
|
{
|
|
auto cm = build();
|
|
cm->add("", 0, nullptr, false);
|
|
}
|
|
|
|
TEST(CommandMapTest, returns_invalid_for_invalid_first_level_sequences)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_INVALID, lookup_command(cm, "Q", command));
|
|
}
|
|
|
|
TEST(CommandMapTest, returns_invalid_for_invalid_second_level_sequences)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_INVALID, lookup_command(cm, "dx", command));
|
|
}
|
|
|
|
TEST(CommandMapTest, returns_incomplete_when_only_count_given)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_INCOMPLETE, lookup_command(cm, "42", command));
|
|
}
|
|
|
|
TEST(CommandMapTest, returns_incomplete_for_incomplete_sequence)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_INCOMPLETE, lookup_command(cm, "d", command));
|
|
}
|
|
|
|
TEST(CommandMapTest, returns_incomplete_when_waiting_for_following_character)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_INCOMPLETE, lookup_command(cm, "f", command));
|
|
}
|
|
|
|
TEST(CommandMapTest, returns_incomplete_when_only_count_given_for_second_unit)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_INCOMPLETE, lookup_command(cm, "d23", command));
|
|
}
|
|
|
|
TEST(CommandMapTest, returns_incomplete_for_empty_sequence)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_INCOMPLETE, lookup_command(cm, "", command));
|
|
}
|
|
|
|
TEST(CommandMapTest, finds_command_with_no_motion_or_following_character)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_COMPLETE, lookup_command(cm, "dd", command));
|
|
Command expected;
|
|
expected.main.id = 1;
|
|
EXPECT_EQ(expected, command);
|
|
}
|
|
|
|
TEST(CommandMapTest, includes_command_count_with_no_following_character)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_COMPLETE, lookup_command(cm, "4dd", command));
|
|
Command expected;
|
|
expected.main.count = 4;
|
|
expected.main.id = 1;
|
|
EXPECT_EQ(expected, command);
|
|
}
|
|
|
|
TEST(CommandMapTest, finds_command_with_following_character)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_COMPLETE, lookup_command(cm, "fx", command));
|
|
Command expected;
|
|
expected.main.id = 2;
|
|
expected.main.following_char = 'x';
|
|
EXPECT_EQ(expected, command);
|
|
}
|
|
|
|
TEST(CommandMapTest, includes_command_count_with_following_character)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_COMPLETE, lookup_command(cm, "30fx", command));
|
|
Command expected;
|
|
expected.main.count = 30;
|
|
expected.main.id = 2;
|
|
expected.main.following_char = 'x';
|
|
EXPECT_EQ(expected, command);
|
|
}
|
|
|
|
TEST(CommandMapTest, finds_command_with_motion)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_COMPLETE, lookup_command(cm, "diw", command));
|
|
Command expected;
|
|
expected.main.id = 3;
|
|
expected.motion.id = 1;
|
|
EXPECT_EQ(expected, command);
|
|
}
|
|
|
|
TEST(CommandMapTest, finds_command_with_motion_with_following_char)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_COMPLETE, lookup_command(cm, "dfx", command));
|
|
Command expected;
|
|
expected.main.id = 3;
|
|
expected.motion.id = 2;
|
|
expected.motion.following_char = 'x';
|
|
EXPECT_EQ(expected, command);
|
|
}
|
|
|
|
TEST(CommandMapTest, includes_motion_unit_count)
|
|
{
|
|
auto cm = build();
|
|
Command command;
|
|
EXPECT_EQ(CommandMap::COMMAND_COMPLETE, lookup_command(cm, "d5fx", command));
|
|
Command expected;
|
|
expected.main.id = 3;
|
|
expected.motion.count = 5;
|
|
expected.motion.id = 2;
|
|
expected.motion.following_char = 'x';
|
|
EXPECT_EQ(expected, command);
|
|
}
|