/*
 * Copyright 2014 The Emscripten Authors.  All rights reserved.
 * Emscripten is available under two separate licenses, the MIT license and the
 * University of Illinois/NCSA Open Source License.  Both these licenses can be
 * found in the LICENSE file.
 */

#include <math.h>
#include <assert.h>
#include <float.h>
#include <stdio.h>

union fi
{
	float f;
	unsigned int i;
};

unsigned int Float2Int(float f)
{
	union fi a;
	a.f = f;
	return a.i;
}

float Fminf(float x, float y)
{
	if (x < y || !(y == y))
		return x;
	else if (y < x || !(x == x))
		return y;
	else if (x != 0.f)
		return x;
	else
		return Float2Int(x) == 0 ? y : x;
}

float Fmaxf(float x, float y)
{
	if (x > y || !(y == y))
		return x;
	else if (y > x || !(x == x))
		return y;
	else if (x != 0.f)
		return x;
	else
		return Float2Int(x) == 0 ? x : y;
}

void TestMin(float a, float b, float ret)
{
	float x = Fminf(a, b);
	if (x != ret)
		printf("min(%f, %f) returned %f, should return ret: %f\n", a, b, x, ret);
	assert(Float2Int(x) == Float2Int(ret));
	float y = Fminf(b, a);
	if (y != ret)
		printf("min(%f, %f) returned %f, should return ret: %f\n", b, a, y, ret);
	assert(Float2Int(y) == Float2Int(ret));
}

void TestMax(float a, float b, float ret)
{
	float x = Fmaxf(a, b);
	if (x != ret)
		printf("max(%f, %f) returned %f, should return ret: %f\n", a, b, x, ret);
	assert(Float2Int(x) == Float2Int(ret));
	float y = Fmaxf(b, a);
	if (y != ret)
		printf("max(%f, %f) returned %f, should return ret: %f\n", b, a, x, ret);
	assert(Float2Int(y) == Float2Int(ret));
}

int main()
{
	TestMin(-INFINITY, INFINITY, -INFINITY);
	TestMax(-INFINITY, INFINITY, INFINITY);

	TestMin(-INFINITY, 1.f, -INFINITY);
	TestMax(-INFINITY, 1.f, 1.f);

	TestMin(INFINITY, 1.f, 1.f);
	TestMax(INFINITY, 1.f, INFINITY);

	TestMin(-INFINITY, NAN, -INFINITY);
	TestMax(-INFINITY, NAN, -INFINITY);
	assert(Float2Int(0.0f) != Float2Int(-0.0f));

	if (NAN == NAN)
		printf("NAN == NAN\n");
	if (NAN != NAN)
		printf("NAN != NAN\n");
	TestMin(-0.0f, 0.0f, -0.0f);
	TestMax(-0.0f, 0.0f, 0.0f);
	printf("Success!\n");
}
