/*
	Test-ZSimplexNoise.cpp
	Author: Chris Ertel

	Purpose :	Unit tests for ZSimplexNoise

	Changelog :
	05/11/2012 - Removed dependency on FreeImage
	12/08/2011 - Removed dependency on ZString (crertel)
	15/02/2011 - Created (crertel)
*/

#include "ZUnitTest.hpp"
#include <ZUtil/ZSimplexNoise.hpp>

#include <iostream>

static const char* test2DSimplexNoise();

//List of unit tests
ZUnitTest ZSimplexNoiseUnitTests[] =
{
	{
		"test2DSimplexNoise",
		test2DSimplexNoise
	},
};

DECLARE_ZTESTBLOCK(ZSimplexNoise);

static void SaveTGA(const char* filename, const char* bitmap)
{
	FILE* fp = fopen(filename, "wb");
	
	if(fp == NULL)
		return;
		
	fputc(0, fp);	//Image ID length 
	fputc(0, fp); 	//Color map type
	fputc(2, fp);	//Image type. 2 = uncompressed true color
	
	char zero[5] = { 0, 0, 0, 0, 0 };
	fwrite(zero, 5, sizeof(char), fp);	//5 bytes of zero for colormap
	
	fputc(0, fp); fputc(0, fp); 	//X image origin: 0x0000
	fputc(0, fp); fputc(0, fp);		//Y image origin: 0x0000
	fputc(0x00, fp); fputc(0x01, fp);	//X image width: 0x0100
	fputc(0x00, fp); fputc(0x01, fp);	//Y image width: 0x0100
	fputc(0x20, fp);				//Image bits per pixel (32)
	fputc((8<<0) | (2<<4), fp);			//bits 0-3: alpha channel depth, bits 4-5: image origin, 2 = top-left
	
	
	fwrite(bitmap, 256*256, 4, fp);
	
	fclose(fp);
}

/*************************************************************************/

static const char* test2DSimplexNoise()
{
	char* bitmap = NULL;
	ZSimplexNoise noisegen;
	int i;
	int j;
	
	bitmap = new char[256*256*4];

	noisegen.reseed(0);
	for (i = 0; i <256; i++)
	{
		for (j = 0; j <256; j++)
		{

			double noiseval = noisegen.noise2( ((float) 2*i)/256.0f,((float) 2*j)/256.0f);
			
			bitmap[ (i*4*256) + (4*j)+ 0] = (char)( 128.0f + (128.0f * (noiseval)));
			bitmap[ (i*4*256) + (4*j)+ 1] = (char)( 128.0f + (128.0f * (noiseval)));
			bitmap[ (i*4*256) + (4*j)+ 2] = (char)( 128.0f + (128.0f * (noiseval)));
			bitmap[ (i*4*256) + (4*j)+ 3] = -1;
		}
	}
	SaveTGA("testnoise1.tga", bitmap);
	

	noisegen.reseed(1);
	for (i = 0; i <256; i++)
	{
		for (j = 0; j <256; j++)
		{

			double noiseval = noisegen.noise2( ((float) 2*i)/256.0f,((float) 2*j)/256.0f);
			
			bitmap[ (i*4*256) + (4*j)+ 0] = (char)( 128.0f + (128.0f * (noiseval)));
			bitmap[ (i*4*256) + (4*j)+ 1] = (char)( 128.0f + (128.0f * (noiseval)));
			bitmap[ (i*4*256) + (4*j)+ 2] = (char)( 128.0f + (128.0f * (noiseval)));
			bitmap[ (i*4*256) + (4*j)+ 3] = -1;
		}
	}
	SaveTGA("testnoise2.tga", bitmap);

	noisegen.reseed(2);
	for (i = 0; i <256; i++)
	{
		for (j = 0; j <256; j++)
		{

			double noiseval = noisegen.noise2( ((float) 2*i)/256.0f,((float) 2*j)/256.0f);
			
			bitmap[ (i*4*256) + (4*j)+ 0] = (char)( 128.0f + (128.0f * (noiseval)));
			bitmap[ (i*4*256) + (4*j)+ 1] = (char)( 128.0f + (128.0f * (noiseval)));
			bitmap[ (i*4*256) + (4*j)+ 2] = (char)( 128.0f + (128.0f * (noiseval)));
			bitmap[ (i*4*256) + (4*j)+ 3] = -1;
		}
	}
	SaveTGA("testnoise3.tga", bitmap);


	delete[] bitmap;
	
	return ZTEST_SUCCESS;
}


