+/*
+ * Copyright (c) 2009 Petri Lehtinen <petri@digip.org>
+ *
+ * Jansson is free software; you can redistribute it and/or modify
+ * it under the terms of the MIT license. See LICENSE for details.
+ */
+
+#include <jansson.h>
+#include "util.h"
+
+int main()
+{
+ json_t *object, *string, *other_string, *value;
+
+ object = json_object();
+ string = json_string("test");
+ other_string = json_string("other");
+
+ if(!object)
+ fail("unable to create object");
+ if(!string)
+ fail("unable to create string");
+ if(!other_string)
+ fail("unable to create string");
+
+ if(json_object_get(object, "a"))
+ fail("value for nonexisting key");
+
+ if(json_object_set(object, "a", string))
+ fail("unable to set value");
+
+ /* invalid UTF-8 in key */
+ if(!json_object_set(object, "a\xefz", string))
+ fail("able to set invalid unicode key");
+
+ value = json_object_get(object, "a");
+ if(!value)
+ fail("no value for existing key");
+ if(value != string)
+ fail("got different value than what was added");
+
+ /* "a", "lp" and "px" collide with a five-bucket hashtable */
+ if(json_object_set(object, "b", string) ||
+ json_object_set(object, "lp", string) ||
+ json_object_set(object, "px", string))
+ fail("unable to set value");
+
+ value = json_object_get(object, "a");
+ if(!value)
+ fail("no value for existing key");
+ if(value != string)
+ fail("got different value than what was added");
+
+ if(json_object_set(object, "a", other_string))
+ fail("unable to replace an existing key");
+
+ value = json_object_get(object, "a");
+ if(!value)
+ fail("no value for existing key");
+ if(value != other_string)
+ fail("got different value than what was set");
+
+ if(!json_object_del(object, "nonexisting"))
+ fail("able to delete a nonexisting key");
+
+ if(json_object_del(object, "px"))
+ fail("unable to delete an existing key");
+
+ if(json_object_del(object, "a"))
+ fail("unable to delete an existing key");
+
+ if(json_object_del(object, "lp"))
+ fail("unable to delete an existing key");
+
+
+ /* add many keys to rehashing */
+
+ if(json_object_set(object, "a", string))
+ fail("unable to set value");
+
+ if(json_object_set(object, "lp", string))
+ fail("unable to set value");
+
+ if(json_object_set(object, "px", string))
+ fail("unable to set value");
+
+ if(json_object_set(object, "c", string))
+ fail("unable to set value");
+
+ if(json_object_set(object, "d", string))
+ fail("unable to set value");
+
+ if(json_object_set(object, "e", string))
+ fail("unable to set value");
+
+ json_decref(string);
+ json_decref(other_string);
+ json_decref(object);
+
+ return 0;
+}