incremental
diff --git a/src/ci_map_tests.cpp b/src/ci_map_tests.cpp
new file mode 100644
index 0000000..acaaa6e
--- /dev/null
+++ b/src/ci_map_tests.cpp
@@ -0,0 +1,78 @@
+#include "crow/ci_map.h"
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using namespace testing;
+
+TEST(CiMap, MapEmpty) {
+  crow::ci_map map;
+  EXPECT_TRUE(map.empty());
+  EXPECT_EQ(map.size(), 0);
+
+  map.emplace("foo", "bar");
+
+  map.clear();
+  EXPECT_TRUE(map.empty());
+}
+
+TEST(CiMap, MapBasicInsert) {
+  crow::ci_map map;
+  map.emplace("foo", "bar");
+  auto x = map.find("foo");
+  ASSERT_NE(x, map.end());
+
+  EXPECT_EQ(map.find("foo")->first, "foo");
+  EXPECT_EQ(map.find("foo")->second, "bar");
+  EXPECT_EQ(map.find("FOO")->first, "foo");
+  EXPECT_EQ(map.find("FOO")->second, "bar");
+}
+
+TEST(CiMap, MapManyInsert) {
+  crow::ci_map map;
+  map.emplace("foo", "car");
+  map.emplace("foo", "boo");
+  map.emplace("bar", "cat");
+  map.emplace("baz", "bat");
+
+  EXPECT_EQ(map.size(), 3);
+  ASSERT_NE(map.find("foo"), map.end());
+  EXPECT_EQ(map.find("foo")->first, "foo");
+  EXPECT_EQ(map.find("foo")->second, "car");
+
+  ASSERT_NE(map.find("FOO"), map.end());
+  EXPECT_EQ(map.find("FOO")->first, "foo");
+  EXPECT_EQ(map.find("FOO")->second, "car");
+  
+  ASSERT_NE(map.find("bar"), map.end());
+  EXPECT_EQ(map.find("bar")->first, "bar");
+  EXPECT_EQ(map.find("bar")->second, "cat");
+
+  ASSERT_NE(map.find("BAR"), map.end());
+  EXPECT_EQ(map.find("BAR")->first, "bar");
+  EXPECT_EQ(map.find("BAR")->second, "cat");
+
+  ASSERT_NE(map.find("baz"), map.end());
+  EXPECT_EQ(map.find("baz")->first, "baz");
+  EXPECT_EQ(map.find("baz")->second, "bat");
+
+  ASSERT_NE(map.find("BAZ"), map.end());
+  EXPECT_EQ(map.find("BAZ")->first, "baz");
+  EXPECT_EQ(map.find("BAZ")->second, "bat");
+
+  EXPECT_EQ(map.count("foo"), 1);
+  EXPECT_EQ(map.count("bar"), 1);
+  EXPECT_EQ(map.count("baz"), 1);
+  EXPECT_EQ(map.count("FOO"), 1);
+  EXPECT_EQ(map.count("BAR"), 1);
+  EXPECT_EQ(map.count("BAZ"), 1);
+}
+
+TEST(CiMap, MapMultiInsert) {
+  crow::ci_map map;
+  map.emplace("foo", "bar1");
+  map.emplace("foo", "bar2");
+  EXPECT_EQ(map.count("foo"), 1);
+  EXPECT_EQ(map.count("FOO"), 1);
+  EXPECT_EQ(map.count("fOo"), 1);
+  EXPECT_EQ(map.count("FOo"), 1);
+}
\ No newline at end of file