// =====================================================================================================================
//  fennec, a free and open source game engine
//  Copyright © 2025 - 2026  Medusa Slockbower
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <https://www.gnu.org/licenses/>.
// =====================================================================================================================

#ifndef FENNEC_TEST_FORMAT_H
#define FENNEC_TEST_FORMAT_H

#include "../test.h"
#include <fennec/format/format.h>

namespace fennec
{

namespace test
{

inline void fennec_test_format() {

	fennec_test_run(fennec::format("{}",      "Hello World!"),    string("Hello World!"));
	fennec_test_run(fennec::format("{0}",     "Hello World!"),    string("Hello World!"));
	fennec_test_run(fennec::format("{0} {0}", "Hello"),           string("Hello Hello"));
	fennec_test_run(fennec::format("{0} {1}", "Hello", "World!"), string("Hello World!"));
	fennec_test_run(fennec::format("{1} {0}", "Hello", "World!"), string("World! Hello"));

	fennec_test_spacer(1);

	fennec_test_run(fennec::format("{:6}",   342),  string("   342"));
	fennec_test_run(fennec::format("{:06}",  342),  string("000342"));
	fennec_test_run(fennec::format("{:*<6}", 342),  string("342***"));
	fennec_test_run(fennec::format("{:*>6}", 342),  string("***342"));
	fennec_test_run(fennec::format("{:*^6}", 342),  string("*342**"));

	fennec_test_spacer(1);

	fennec_test_run(fennec::format("{0:},{0:+},{0:-},{0: }", 1),  string("1,+1,1, 1"));
	fennec_test_run(fennec::format("{0:},{0:+},{0:-},{0: }", -1), string("-1,-1,-1,-1"));

	fennec_test_spacer(1);

	fennec_test_run(fennec::format("{:#06d}", 15), string("000015"));
	fennec_test_run(fennec::format("{:#06x}", 15), string("0x000f"));
	fennec_test_run(fennec::format("{:#06X}", 15), string("0X000F"));
	fennec_test_run(fennec::format("{:#06o}", 15), string("000017"));
	fennec_test_run(fennec::format("{:#06b}", 15), string("0b1111"));
	fennec_test_run(fennec::format("{:#06B}", 15), string("0B1111"));

	fennec_test_spacer(1);

	fennec_test_run(fennec::format("{:#06d}", -15), string("-00015"));
	fennec_test_run(fennec::format("{:#06x}", -15), string("-0x00f"));
	fennec_test_run(fennec::format("{:#06X}", -15), string("-0X00F"));
	fennec_test_run(fennec::format("{:#06o}", -15), string("-00017"));
	fennec_test_run(fennec::format("{:#06b}", -15), string("-0b1111"));
	fennec_test_run(fennec::format("{:#06B}", -15), string("-0B1111"));

	fennec_test_spacer(1);

	fennec_test_run(fennec::format("{},{}",           true, false), string("true,false"));
	fennec_test_run(fennec::format("{:#06b},{:#06b}", true, false), string("0b0001,0b0000"));

	fennec_test_spacer(1);

	fennec_test_run(fennec::format("{:10f}",    fennec::pi<float>()),        string("  3.141593"));
	fennec_test_run(fennec::format("{:{}f}",    fennec::pi<float>(), 10),    string("  3.141593"));
	fennec_test_run(fennec::format("{:.5f}",    fennec::pi<float>()),        string("3.14159"));
	fennec_test_run(fennec::format("{:.{}f}",   fennec::pi<float>(), 5),     string("3.14159"));
	fennec_test_run(fennec::format("{:10.5f}",  fennec::pi<float>()),        string("   3.14159"));
	fennec_test_run(fennec::format("{:{}.{}f}", fennec::pi<float>(), 10, 5), string("   3.14159"));

	fennec_test_spacer(1);

	fennec_test_run(fennec::format("{:.5f}", fennec::pi<float>()), string("3.14159"));
	fennec_test_run(fennec::format("{:.5a}", fennec::pi<float>()), string("1.921fbp+1"));
	fennec_test_run(fennec::format("{:.5g}", fennec::pi<float>()), string("3.1416"));
	fennec_test_run(fennec::format("{:.5e}", fennec::pi<float>()), string("3.14159e+00"));
}

}

}

#endif // FENNEC_TEST_FORMAT_H
