# Test the to_json() function on every basic data type.  For container types,
# test with no elements, with one element, and with more than one element.
# Test that the "only_loggable" option works (output only record fields with
# the &log attribute).
# @TEST-EXEC: zeek -b %INPUT >output
# @TEST-EXEC: btest-diff output

type color: enum { Red, White, Blue };

type myrec1: record {
	c: count &optional;
	s: string &log;
};

type myrec2: record {
	m: myrec1 &log;
};

event zeek_init()
	{
	# #####################################
	# Test the basic (non-container) types:

	local b: bool = T;
	print to_json(b);

	local c: count = 123;
	print to_json(c);

	local i: int = -999;
	print to_json(i);

	local d1: double = 3.14;
	local d2: double = -1.23456789e308;
	local d3: double = 9e-308;
	print to_json(d1);
	print to_json(d2);
	print to_json(d3);

	local t: time = double_to_time(1480788576.868945);
	print to_json(t);

	local ti: interval = -12hr;
	print to_json(ti);

	local s1: string = "hello";
	local s2: string = "";
	print to_json(s1);
	print to_json(s2);

	local p1: port = 65535/tcp;
	local p2: port = 1/udp;
	local p3: port = 123/icmp;
	local p4: port = 0/unknown;
	print to_json(p1);
	print to_json(p2);
	print to_json(p3);
	print to_json(p4);

	local a1: addr = 1.2.3.4;
	local a2: addr = [ffff:1234::1];
	local a3: addr = [::ffff:123.123.123.123];
	print to_json(a1);
	print to_json(a2);
	print to_json(a3);

	local su1: subnet = 192.0.0.0/8;
	local su2: subnet = [fe80::]/64;
	print to_json(su1);
	print to_json(su2);

	local e: color = Red;
	print to_json(e);

	local p: pattern = /^abcd/;
	print to_json(p);

	# #########################
	# Test the container types:

	# Records
	local re1 = myrec1($c=100, $s="test");
	local re2 = myrec1($s="test");
	local re3 = myrec2($m=myrec1($c=15, $s="test"));
	print to_json(re1);
	print to_json(re1, T);
	print to_json(re2);
	print to_json(re3, T);

	# Vectors
	local ve1: vector of count = vector();
	local ve2: vector of count = vector(2, 1);
	local ve3: vector of addr = vector(1.2.3.4);
	local ve4: vector of set[bool] = vector(set(T, F));
	local ve5: vector of myrec1 = vector(myrec1($s="test", $c=2));
	local ve6: vector of count;
	ve6[0] = 0;
	ve6[2] = 2;
	print to_json(ve1);
	print to_json(ve2);
	print to_json(ve3);
	print to_json(ve4);
	print to_json(ve5, T);
	print to_json(ve6);

	# Sets
	local st1: set[count] = set();
	local st2: set[count] = set(2, 1);
	local st3: set[addr] = set(1.2.3.4);
	local st4: set[myrec1] = set(myrec1($s="test"));
	local st5: set[myrec1] = set(myrec1($s="test", $c=2));
	local st6: set[string, count] = { ["one", 1], ["two", 2], ["three", 3] };
	print to_json(st1);
	print to_json(st2);
	print to_json(st3);
	print to_json(st4);
	print to_json(st5, T);
	print to_json(st6);

	# Tables
	local ta1: table[count] of addr = table();
	local ta2: table[count] of addr = {[1] = 10.1.1.1, [2] = 10.2.2.2};
	local ta3: table[addr] of table[string] of count = {[10.1.1.1] = table(["a"] = 1), [10.2.2.2] = table(["b"] = 2)};
	local ta4: table[addr] of vector of count = {[10.1.1.1] = vector(1, 2), [10.2.2.2] = vector(3, 5)};
	local ta5: table[count] of myrec1 = {[1] = myrec1($s="test", $c=2)};
	print to_json(ta1);
	print to_json(ta2);
	print to_json(ta3);
	print to_json(ta4);
	print to_json(ta5, T);

	# Opaque
	local o1: opaque of topk = topk_init(5);
	print to_json(o1);
	}
