TEST_F(JsonArray_Container_Tests, Grow_WhenValuesAreAdded) {
  _array.add("hello");
  sizeMustBe(1);

  _array.add("world");
  sizeMustBe(2);
}
TEST_F(JsonParser_Object_Test, TwoDoubles) {
  whenInputIs("{\"key1\":12.345,\"key2\":-7E89}");
  parseMustSucceed();
  sizeMustBe(2);
  keyMustHaveValue("key1", 12.345);
  keyMustHaveValue("key2", -7E89);
}
TEST_F(JsonParser_Object_Test, TwoBooleans) {
  whenInputIs("{\"key1\":true,\"key2\":false}");
  parseMustSucceed();
  sizeMustBe(2);
  keyMustHaveValue("key1", true);
  keyMustHaveValue("key2", false);
}
TEST_F(JsonParser_Array_Tests, StringWithEscapedChars) {
  whenInputIs("[\"1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\"]");

  parseMustSucceed();
  sizeMustBe(1);
  firstElementMustBe("1\"2\\3/4\b5\f6\n7\r8\t9");
}
TEST_F(JsonParser_Array_Tests, CCommentBeforeClosingBracket) {
  whenInputIs("[\"hello\"/*COMMENT*/]");

  parseMustSucceed();
  sizeMustBe(1);
  firstElementMustBe("hello");
}
TEST_F(JsonParser_Object_Test, TwoStringsSpaceAfterComma) {
  whenInputIs("{\"key1\":\"value1\" ,\"key2\":\"value2\"}");
  parseMustSucceed();
  sizeMustBe(2);
  keyMustHaveValue("key1", "value1");
  keyMustHaveValue("key2", "value2");
}
TEST_F(JsonParser_Array_Tests, CppCommentBeforeOpeningBracket) {
  whenInputIs("//COMMENT\n\t[\"hello\"]");

  parseMustSucceed();
  sizeMustBe(1);
  firstElementMustBe("hello");
}
TEST_F(JsonParser_Array_Tests, CppCommentAfterClosingBracket) {
  whenInputIs("[\"hello\"]//COMMENT\n");

  parseMustSucceed();
  sizeMustBe(1);
  firstElementMustBe("hello");
}
TEST_F(JsonParser_Array_Tests, OneInteger) {
  whenInputIs("[42]");

  parseMustSucceed();
  sizeMustBe(1);
  firstElementMustBe(42);
}
TEST_F(JsonParser_Object_Test, TwoIntergers) {
  whenInputIs("{\"key1\":42,\"key2\":-42}");
  parseMustSucceed();
  sizeMustBe(2);
  keyMustHaveValue("key1", 42);
  keyMustHaveValue("key2", -42);
}
TEST_F(JsonParser_Array_Tests, CCommentAfterOpeningBracket) {
  whenInputIs("[/*COMMENT*/ \"hello\"]");

  parseMustSucceed();
  sizeMustBe(1);
  firstElementMustBe("hello");
}
TEST_F(JsonParser_Array_Tests, OneIntegerWithSpacesBefore) {
  whenInputIs("[ \t\r\n42]");

  parseMustSucceed();
  sizeMustBe(1);
  firstElementMustBe(42);
}
TEST_F(JsonParser_Array_Tests, UnsignedLong) {
  whenInputIs("[4294967295]");

  parseMustSucceed();
  sizeMustBe(1);
  firstElementMustBe(4294967295UL);
}
TEST_F(JsonParser_Array_Tests, TwoIntegers) {
  whenInputIs("[42,84]");

  parseMustSucceed();
  sizeMustBe(2);
  firstElementMustBe(42);
  secondElementMustBe(84);
}
TEST_F(JsonParser_Array_Tests, EmptyStringNoQuotes) {
  whenInputIs("[,]");

  parseMustSucceed();
  sizeMustBe(2);
  firstElementMustBe("");
  secondElementMustBe("");
}
TEST_F(JsonParser_Array_Tests, TwoStringsNoQuotes) {
  whenInputIs("[ hello , world ]");

  parseMustSucceed();
  sizeMustBe(2);
  firstElementMustBe("hello");
  secondElementMustBe("world");
}
TEST_F(JsonParser_Array_Tests, TwoStringsDoubleQuotes) {
  whenInputIs("[ \"hello\" , \"world\" ]");

  parseMustSucceed();
  sizeMustBe(2);
  firstElementMustBe("hello");
  secondElementMustBe("world");
}
TEST_F(JsonParser_Array_Tests, TwoBooleans) {
  whenInputIs("[true,false]");

  parseMustSucceed();
  sizeMustBe(2);
  firstElementMustBe(true);
  secondElementMustBe(false);
}
TEST_F(JsonParser_Array_Tests, TwoDoubles) {
  whenInputIs("[4.2,1e2]");

  parseMustSucceed();
  sizeMustBe(2);
  firstElementMustBe(4.2);
  secondElementMustBe(1e2);
}
TEST_F(JsonParser_Array_Tests, CppCommentAfterComma) {
  whenInputIs("[\"hello\",//COMMENT\n\"world\"]");

  parseMustSucceed();
  sizeMustBe(2);
  firstElementMustBe("hello");
  secondElementMustBe("world");
}
TEST_F(JsonParser_Array_Tests, CCommentBeforeComma) {
  whenInputIs("[\"hello\"/*COMMENT*/,\"world\"]");

  parseMustSucceed();
  sizeMustBe(2);
  firstElementMustBe("hello");
  secondElementMustBe("world");
}
TEST_F(JsonParser_Object_Test, TwoNulls) {
  const char *const nullstr = 0;

  whenInputIs("{\"key1\":null,\"key2\":null}");
  parseMustSucceed();
  sizeMustBe(2);
  keyMustHaveValue("key1", nullstr);
  keyMustHaveValue("key2", nullstr);
}
TEST_F(JsonParser_Array_Tests, TwoNulls) {
  const char *const nullCharPtr = 0;

  whenInputIs("[null,null]");

  parseMustSucceed();
  sizeMustBe(2);
  firstElementMustBe(nullCharPtr);
  secondElementMustBe(nullCharPtr);
}
TEST_F(JsonArray_Container_Tests, RemoveLastElement) {
  _array.add("one");
  _array.add("two");
  _array.add("three");

  _array.removeAt(2);

  sizeMustBe(2);
  firstMustEqual("one");
  secondMustEqual("two");
}
TEST_F(JsonParser_Object_Test, OneStringSpaceAfterValue) {
  whenInputIs("{\"key\":\"value\" }");
  parseMustSucceed();
  sizeMustBe(1);
  keyMustHaveValue("key", "value");
}
TEST_F(JsonArray_Container_Tests, InitialSizeIsZero) { sizeMustBe(0); }
TEST_F(JsonArray_Container_Tests, DontGrow_WhenValuesAreReplaced) {
  _array.add("hello");
  _array[0] = "world";
  sizeMustBe(1);
}
TEST_F(JsonParser_Object_Test, OneStringSingleQuotes) {
  whenInputIs("{'key':'value'}");
  parseMustSucceed();
  sizeMustBe(1);
  keyMustHaveValue("key", "value");
}
TEST_F(JsonParser_Array_Tests, EmptyArrayWithLeadingSpaces) {
  whenInputIs("  []");

  parseMustSucceed();
  sizeMustBe(0);
}
TEST_F(JsonParser_Array_Tests, EmptyArray) {
  whenInputIs("[]");

  parseMustSucceed();
  sizeMustBe(0);
}