/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing#kwsys for details.  */
#include "kwsysPrivate.h"
#include KWSYS_HEADER(SystemInformation.hxx)

// Work-around CMake dependency scanning limitation.  This must
// duplicate the above list of headers.
#if 0
#  include "SystemInformation.hxx.in"
#endif

#include <iostream>

#define printMethod(info, m) std::cout << #m << ": " << info.m() << "\n"

#define printMethod2(info, m, unit)                                           \
  std::cout << #m << ": " << info.m() << " " << unit << "\n"

#define printMethod3(info, m, unit)                                           \
  std::cout << #m << ": " << info.m << " " << unit << "\n"

int testSystemInformation(int, char* [])
{
  std::cout << "CTEST_FULL_OUTPUT\n"; // avoid truncation

  kwsys::SystemInformation info;
  info.RunCPUCheck();
  info.RunOSCheck();
  info.RunMemoryCheck();
  printMethod(info, GetOSName);
  printMethod(info, GetOSIsLinux);
  printMethod(info, GetOSIsApple);
  printMethod(info, GetOSIsWindows);
  printMethod(info, GetHostname);
  printMethod(info, GetFullyQualifiedDomainName);
  printMethod(info, GetOSRelease);
  printMethod(info, GetOSVersion);
  printMethod(info, GetOSPlatform);
  printMethod(info, Is64Bits);
  printMethod(info, GetVendorString);
  printMethod(info, GetVendorID);
  printMethod(info, GetTypeID);
  printMethod(info, GetFamilyID);
  printMethod(info, GetModelID);
  printMethod(info, GetExtendedProcessorName);
  printMethod(info, GetSteppingCode);
  printMethod(info, GetProcessorSerialNumber);
  printMethod2(info, GetProcessorCacheSize, "KB");
  printMethod(info, GetLogicalProcessorsPerPhysical);
  printMethod2(info, GetProcessorClockFrequency, "MHz");
  printMethod(info, GetNumberOfLogicalCPU);
  printMethod(info, GetNumberOfPhysicalCPU);
  printMethod(info, DoesCPUSupportCPUID);
  printMethod(info, GetProcessorAPICID);
  printMethod2(info, GetTotalVirtualMemory, "MB");
  printMethod2(info, GetAvailableVirtualMemory, "MB");
  printMethod2(info, GetTotalPhysicalMemory, "MB");
  printMethod2(info, GetAvailablePhysicalMemory, "MB");
  printMethod3(info, GetHostMemoryTotal(), "KiB");
  printMethod3(info, GetHostMemoryAvailable("KWSHL"), "KiB");
  printMethod3(info, GetProcMemoryAvailable("KWSHL", "KWSPL"), "KiB");
  printMethod3(info, GetHostMemoryUsed(), "KiB");
  printMethod3(info, GetProcMemoryUsed(), "KiB");
  printMethod(info, GetLoadAverage);

  for (long int i = 0; i <= 31; i++) {
    if (info.DoesCPUSupportFeature(static_cast<long int>(1) << i)) {
      std::cout << "CPU feature " << i << "\n";
    }
  }

  /* test stack trace
   */
  std::cout << "Program Stack:" << std::endl
            << kwsys::SystemInformation::GetProgramStack(0, 0) << std::endl
            << std::endl;

  /* test segv handler
  info.SetStackTraceOnError(1);
  double *d = (double*)100;
  *d=0;
  */

  /* test abort handler
  info.SetStackTraceOnError(1);
  abort();
  */

  return 0;
}
