# @TEST-DOC: Test that the ASCII writer logs values of type "double" correctly.
#
# @TEST-EXEC: zeek -b %INPUT test-json.zeek
# @TEST-EXEC: mv test.log json.log
# @TEST-EXEC: zeek -b %INPUT
#
# Override the canonifiers in the following: we don't want to canonify
# the double-format numbers themselves:
# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-openclose-timestamps btest-diff test.log
# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff json.log
# 
# Make sure  we do not write out scientific notation for doubles.

module Test;

export {
	redef enum Log::ID += { LOG };

	type Info: record {
		d: double &log;
	};
}

function logwrite(val: double)
{
	Log::write(Test::LOG, [$d=val]);
}

event zeek_init()
{
	local d: double;
	local dmax: double = 1.79e308;
	local dmin: double = 2.23e-308;

	Log::create_stream(Test::LOG, [$columns=Info]);

	# relatively large values
	logwrite(2153226000.0);
	logwrite(2153226000.1);
	logwrite(2153226000.123456789);

	# relatively small values
	logwrite(1.0);
	logwrite(1.1);
	logwrite(1.123456789);
	logwrite(-1.123456789);
	logwrite(1.1234);
	logwrite(.1234);

	# scientific notation (positive exponents)
	logwrite(5e4);
	logwrite(-5e4);
	logwrite(3.14e15);
	logwrite(-3.14e15);
	logwrite(dmax);
	logwrite(-dmax);

	# scientific notation (negative exponents)
	logwrite(1.23456789e-5);
	logwrite(dmin);
	logwrite(-dmin);

	# inf
	d = dmax;       # ok
	d = d * 2.0;    # inf
	logwrite(d);

	# -inf
	d = -dmax;      # ok
	d = d * 2.0;    # -inf
	logwrite(d);

	# negative zero (compares equal to 0.0, but has different representation)
	d = -0.0;
	logwrite(d);

	# nan
	d = dmax;       # ok
	d = d * 2.0;    # inf
	d = d * 0.0;    # nan
	logwrite(d);
}

# @TEST-START-FILE test-json.zeek

redef LogAscii::use_json = T;

# @TEST-END-FILE
