
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <log4cxx/level.h>
#include "testchar.h"
#include "logunit.h"

#if LOG4CXX_CFSTRING_API
	#include <CoreFoundation/CFString.h>
#endif

using namespace log4cxx;

LOGUNIT_CLASS(LevelTestCase)
{
	LOGUNIT_TEST_SUITE(LevelTestCase);
	LOGUNIT_TEST(testToLevelFatal);
	LOGUNIT_TEST(testTraceInt);
	LOGUNIT_TEST(testTrace);
	LOGUNIT_TEST(testIntToTrace);
	LOGUNIT_TEST(testStringToTrace);
#if LOG4CXX_WCHAR_T_API
	LOGUNIT_TEST(testWideStringToTrace);
#endif
#if LOG4CXX_UNICHAR_API
	LOGUNIT_TEST(testUniCharStringToTrace);
#endif
#if LOG4CXX_CFSTRING_API
	LOGUNIT_TEST(testCFStringToTrace);
#endif
	LOGUNIT_TEST(testTrimmedToTrace);
	LOGUNIT_TEST_SUITE_END();

public:
	void testToLevelFatal()
	{
		LevelPtr level(Level::toLevel(LOG4CXX_TEST_STR("fATal")));
		LOGUNIT_ASSERT_EQUAL((int) Level::FATAL_INT, level->toInt());
	}

	/**
	 * Tests Level::TRACE_INT.
	 */
	void testTraceInt()
	{
		LOGUNIT_ASSERT_EQUAL(5000, (int) Level::TRACE_INT);
	}

	/**
	 * Tests Level.TRACE.
	 */
	void testTrace()
	{
		LOGUNIT_ASSERT(Level::getTrace()->toString() == LOG4CXX_STR("TRACE"));
		LOGUNIT_ASSERT_EQUAL(5000, Level::getTrace()->toInt());
		LOGUNIT_ASSERT_EQUAL(7, Level::getTrace()->getSyslogEquivalent());
	}

	/**
	 * Tests Level.toLevel(Level.TRACE_INT).
	 */
	void testIntToTrace()
	{
		LevelPtr trace(Level::toLevel(5000));
		LOGUNIT_ASSERT(trace->toString() == LOG4CXX_STR("TRACE"));
	}

	/**
	 * Tests Level.toLevel("TRACE");
	 */
	void testStringToTrace()
	{
		LevelPtr trace(Level::toLevel("TRACE"));
		LOGUNIT_ASSERT(trace->toString() == LOG4CXX_STR("TRACE"));
	}

#if LOG4CXX_WCHAR_T_API
	/**
	 * Tests Level.toLevel(L"TRACE");
	 */
	void testWideStringToTrace()
	{
		LevelPtr trace(Level::toLevel(L"TRACE"));
		LOGUNIT_ASSERT(trace->toString() == LOG4CXX_STR("TRACE"));
	}
#endif

#if LOG4CXX_UNICHAR_API
	/**
	 * Tests Level.toLevel("TRACE");
	 */
	void testUniCharStringToTrace()
	{
		const log4cxx::UniChar name[] = { 'T', 'R', 'A', 'C', 'E', 0 };
		LevelPtr trace(Level::toLevel(name));
		LOGUNIT_ASSERT(trace->toString() == LOG4CXX_STR("TRACE"));
	}
#endif

#if LOG4CXX_CFSTRING_API
	/**
	 * Tests Level.toLevel(CFSTR("TRACE"));
	 */
	void testCFStringToTrace()
	{
		LevelPtr trace(Level::toLevel(CFSTR("TRACE")));
		LOGUNIT_ASSERT(trace->toString() == LOG4CXX_STR("TRACE"));
	}
#endif

	/**
	 * Tests Level.toLevel("TRACE ");
	 */
	void testTrimmedToTrace()
	{
		LevelPtr trace(Level::toLevel("TRACE "));
		LOGUNIT_ASSERT(trace->toString() == LOG4CXX_STR("TRACE"));
	}

};

LOGUNIT_TEST_SUITE_REGISTRATION(LevelTestCase);
