/*
 * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
 *               2018, 2019, 2020
 *   Jonathan Schleifer <js@nil.im>
 *
 * All rights reserved.
 *
 * This file is part of ObjFW. It may be distributed under the terms of the
 * Q Public License 1.0, which can be found in the file LICENSE.QPL included in
 * the packaging of this file.
 *
 * Alternatively, it may be distributed under the terms of the GNU General
 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

#include "config.h"

#import "TestsAppDelegate.h"

static OFString *module = @"OFSystemInfo";

@implementation TestsAppDelegate (OFSystemInfoTests)
- (void)systemInfoTests
{
	void *pool = objc_autoreleasePoolPush();
#ifdef OF_HAVE_FILES
	OFString *userConfigPath, *userDataPath;
#endif

	PRINT(GREEN, @"Page size: %zd", [OFSystemInfo pageSize]);

	PRINT(GREEN, @"Number of CPUs: %zd", [OFSystemInfo numberOfCPUs]);

	PRINT(GREEN, @"ObjFW version: %@", [OFSystemInfo ObjFWVersion]);

	PRINT(GREEN, @"ObjFW version major: %u",
	    [OFSystemInfo ObjFWVersionMajor]);

	PRINT(GREEN, @"ObjFW version minor: %u",
	    [OFSystemInfo ObjFWVersionMinor]);

	PRINT(GREEN, @"Operating system name: %@",
	    [OFSystemInfo operatingSystemName]);

	PRINT(GREEN, @"Operating system version: %@",
	    [OFSystemInfo operatingSystemVersion]);

#ifdef OF_HAVE_FILES
	@try {
		userConfigPath = [OFSystemInfo userConfigPath];
	} @catch (OFNotImplementedException *e) {
		userConfigPath = @"Not implemented";
	}
	PRINT(GREEN, @"User config path: %@", userConfigPath);

	@try {
		userDataPath = [OFSystemInfo userDataPath];
	} @catch (OFNotImplementedException *e) {
		userDataPath = @"Not implemented";
	}
	PRINT(GREEN, @"User data path: %@", userDataPath);
#endif

	PRINT(GREEN, @"CPU vendor: %@", [OFSystemInfo CPUVendor]);

	PRINT(GREEN, @"CPU model: %@", [OFSystemInfo CPUModel]);

#if defined(OF_X86_64) || defined(OF_X86)
	PRINT(GREEN, @"Supports MMX: %d", [OFSystemInfo supportsMMX]);

	PRINT(GREEN, @"Supports SSE: %d", [OFSystemInfo supportsSSE]);

	PRINT(GREEN, @"Supports SSE2: %d", [OFSystemInfo supportsSSE2]);

	PRINT(GREEN, @"Supports SSE3: %d", [OFSystemInfo supportsSSE3]);

	PRINT(GREEN, @"Supports SSSE3: %d", [OFSystemInfo supportsSSSE3]);

	PRINT(GREEN, @"Supports SSE4.1: %d", [OFSystemInfo supportsSSE41]);

	PRINT(GREEN, @"Supports SSE4.2: %d", [OFSystemInfo supportsSSE42]);

	PRINT(GREEN, @"Supports AVX: %d", [OFSystemInfo supportsAVX]);

	PRINT(GREEN, @"Supports AVX2: %d", [OFSystemInfo supportsAVX2]);

	PRINT(GREEN, @"Supports AES-NI: %d", [OFSystemInfo supportsAESNI]);

	PRINT(GREEN, @"Supports SHA extensions: %d",
	    [OFSystemInfo supportsSHAExtensions]);
#endif

#ifdef OF_POWERPC
	PRINT(GREEN, @"Supports AltiVec: %d", [OFSystemInfo supportsAltiVec]);
#endif

	objc_autoreleasePoolPop(pool);
}
@end
