#include "head.c"

#include "QF/mathlib.h"

#define DB 0xdeadbeef

static float float_time = 1;

static pr_ivec4_t float_state_init[] = {
	{ 0,   0, DB, DB },
	{ 10, 11, 20, 21 },
	{  0,  0,  0,  0 },
	{  0,  0,  0,  0 },
	{  0,  0,  0,  0 },
};

#define f1  0x3f800000
#define f11 0x3f8ccccd
#define f2  0x40000000
static pr_ivec4_t float_state_expect[] = {
	{  0,  8,  f1, DB },
	{ 10, 11,  20, 21 },
	{  0,  0,   0,  0 },
	{ 10, 20, f11,  0 },
	{ 11, 21,  f2,  0 },
};

static dstatement_t float_state_statements[] = {
	{ OP(0, 0, 0, OP_LEA_A),     4, 0, 1 },
	{ OP(0, 0, 0, OP_STATE_ft),  4, 6, 0 },
	{ OP(0, 0, 0, OP_LEA_A),     8, 0, 1 },
	{ OP(0, 0, 0, OP_STATE_ftt), 5, 7, 2 },
};

static double double_time = 1;

static pr_ivec4_t double_state_init[] = {
	{ 0,   0, DB, DB },
	{ 10, 11, 20, 21 },
	{  0,  0,  0,  0 },
	{  0,  0,  0,  0 },
	{  0,  0,  0,  0 },
};

#define d1l  0x00000000
#define d1h  0x3ff00000
#define d11l 0x9999999a
#define d11h 0x3ff19999
#define d2l  0x00000000
#define d2h  0x40000000
static pr_ivec4_t double_state_expect[] = {
	{  0,  8,  d1l,  d1h },
	{ 10, 11,   20,   21 },
	{  0,  0,    0,    0 },
	{ 10, 20, d11l, d11h },
	{ 11, 21,  d2l,  d2h },
};

static dstatement_t double_state_statements[] = {
	{ OP(0, 0, 0, OP_LEA_A),     4, 0, 1 },
	{ OP(0, 0, 0, OP_STATE_dt),  4, 6, 0 },
	{ OP(0, 0, 0, OP_LEA_A),     8, 0, 1 },
	{ OP(0, 0, 0, OP_STATE_dtt), 5, 7, 2 },
};

test_t tests[] = {
	{
		.desc = "float state",
		.num_globals = num_globals(float_state_init,float_state_expect),
		.num_statements = num_statements (float_state_statements),
		.statements = float_state_statements,
		.init_globals = (pr_int_t *) float_state_init,
		.expect_globals = (pr_int_t *) float_state_expect,
		.self = 1,
		.ftime = 2,
		.float_time = &float_time,
		.edict_area = 8,
		.frame = 0,
		.think = 1,
		.nextthink = 2,
	},
	{
		.desc = "double state",
		.num_globals = num_globals(double_state_init,double_state_expect),
		.num_statements = num_statements (double_state_statements),
		.statements = double_state_statements,
		.init_globals = (pr_int_t *) double_state_init,
		.expect_globals = (pr_int_t *) double_state_expect,
		.self = 1,
		.dtime = 2,
		.double_time = &double_time,
		.edict_area = 8,
		.frame = 0,
		.think = 1,
		.nextthink = 2,
	},
};

#include "main.c"