From 6e05c4fe328c735fbcf7ebd5006554c67acf2f66 Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Fri, 28 Nov 2014 10:06:07 -0800 Subject: [PATCH] C++ Testing Script --- .../Cpp Tests.xcodeproj/project.pbxproj | 241 ++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/Cpp Tests.xccheckout | 41 ++ .../xcshareddata/XPC Tests.xccheckout | 41 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 34178 bytes .../WorkspaceSettings.xcsettings | 10 + .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../xcschemes/XPC Tests.xcscheme | 86 ++++ .../xcschemes/xcschememanagement.plist | 22 + TestScripts/XPC Tests/XPC Tests/XPC_Tests.1 | 79 ++++ TestScripts/XPC Tests/XPC Tests/main.cpp | 410 ++++++++++++++++++ 11 files changed, 942 insertions(+) create mode 100644 TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.pbxproj create mode 100644 TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcshareddata/Cpp Tests.xccheckout create mode 100644 TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcshareddata/XPC Tests.xccheckout create mode 100644 TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcschemes/XPC Tests.xcscheme create mode 100644 TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 TestScripts/XPC Tests/XPC Tests/XPC_Tests.1 create mode 100644 TestScripts/XPC Tests/XPC Tests/main.cpp diff --git a/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.pbxproj b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.pbxproj new file mode 100644 index 0000000..76a109f --- /dev/null +++ b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.pbxproj @@ -0,0 +1,241 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BE9C6BAF1A253FA100EBE08A /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE9C6BAE1A253FA100EBE08A /* main.cpp */; }; + BE9C6BB11A253FA100EBE08A /* XPC_Tests.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = BE9C6BB01A253FA100EBE08A /* XPC_Tests.1 */; }; + BE9C6BB91A25402300EBE08A /* xplaneConnect.c in Sources */ = {isa = PBXBuildFile; fileRef = BE9C6BB71A25402300EBE08A /* xplaneConnect.c */; }; + BE9C6BBA1A25402300EBE08A /* xplaneConnect.h in Sources */ = {isa = PBXBuildFile; fileRef = BE9C6BB81A25402300EBE08A /* xplaneConnect.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + BE9C6BA91A253FA100EBE08A /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + BE9C6BB11A253FA100EBE08A /* XPC_Tests.1 in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + BE9C6BAB1A253FA100EBE08A /* Cpp Tests */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Cpp Tests"; sourceTree = BUILT_PRODUCTS_DIR; }; + BE9C6BAE1A253FA100EBE08A /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + BE9C6BB01A253FA100EBE08A /* XPC_Tests.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = XPC_Tests.1; sourceTree = ""; }; + BE9C6BB71A25402300EBE08A /* xplaneConnect.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = xplaneConnect.c; path = ../../C/src/xplaneConnect.c; sourceTree = ""; }; + BE9C6BB81A25402300EBE08A /* xplaneConnect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = xplaneConnect.h; path = ../../C/src/xplaneConnect.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BE9C6BA81A253FA100EBE08A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BE9C6BA21A253FA100EBE08A = { + isa = PBXGroup; + children = ( + BE9C6BB71A25402300EBE08A /* xplaneConnect.c */, + BE9C6BB81A25402300EBE08A /* xplaneConnect.h */, + BE9C6BAD1A253FA100EBE08A /* Cpp Tests */, + BE9C6BAC1A253FA100EBE08A /* Products */, + ); + sourceTree = ""; + }; + BE9C6BAC1A253FA100EBE08A /* Products */ = { + isa = PBXGroup; + children = ( + BE9C6BAB1A253FA100EBE08A /* Cpp Tests */, + ); + name = Products; + sourceTree = ""; + }; + BE9C6BAD1A253FA100EBE08A /* Cpp Tests */ = { + isa = PBXGroup; + children = ( + BE9C6BAE1A253FA100EBE08A /* main.cpp */, + BE9C6BB01A253FA100EBE08A /* XPC_Tests.1 */, + ); + name = "Cpp Tests"; + path = "XPC Tests"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BE9C6BAA1A253FA100EBE08A /* Cpp Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = BE9C6BB41A253FA100EBE08A /* Build configuration list for PBXNativeTarget "Cpp Tests" */; + buildPhases = ( + BE9C6BA71A253FA100EBE08A /* Sources */, + BE9C6BA81A253FA100EBE08A /* Frameworks */, + BE9C6BA91A253FA100EBE08A /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Cpp Tests"; + productName = "XPC Tests"; + productReference = BE9C6BAB1A253FA100EBE08A /* Cpp Tests */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BE9C6BA31A253FA100EBE08A /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = "Chris Teubert"; + }; + buildConfigurationList = BE9C6BA61A253FA100EBE08A /* Build configuration list for PBXProject "Cpp Tests" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = BE9C6BA21A253FA100EBE08A; + productRefGroup = BE9C6BAC1A253FA100EBE08A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + BE9C6BAA1A253FA100EBE08A /* Cpp Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + BE9C6BA71A253FA100EBE08A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BE9C6BB91A25402300EBE08A /* xplaneConnect.c in Sources */, + BE9C6BBA1A25402300EBE08A /* xplaneConnect.h in Sources */, + BE9C6BAF1A253FA100EBE08A /* main.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + BE9C6BB21A253FA100EBE08A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + BE9C6BB31A253FA100EBE08A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + SDKROOT = macosx; + }; + name = Release; + }; + BE9C6BB51A253FA100EBE08A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "Cpp Tests"; + }; + name = Debug; + }; + BE9C6BB61A253FA100EBE08A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "Cpp Tests"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BE9C6BA61A253FA100EBE08A /* Build configuration list for PBXProject "Cpp Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BE9C6BB21A253FA100EBE08A /* Debug */, + BE9C6BB31A253FA100EBE08A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BE9C6BB41A253FA100EBE08A /* Build configuration list for PBXNativeTarget "Cpp Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BE9C6BB51A253FA100EBE08A /* Debug */, + BE9C6BB61A253FA100EBE08A /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = BE9C6BA31A253FA100EBE08A /* Project object */; +} diff --git a/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f48beca --- /dev/null +++ b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcshareddata/Cpp Tests.xccheckout b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcshareddata/Cpp Tests.xccheckout new file mode 100644 index 0000000..b441f49 --- /dev/null +++ b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcshareddata/Cpp Tests.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 416D1A24-40F3-4397-8D94-7BF209A1B094 + IDESourceControlProjectName + Cpp Tests + IDESourceControlProjectOriginsDictionary + + C03F0B00-9A73-4E8C-88E5-1BC53A92AE34 + https://github.com/nasa/XPlaneConnect.git + + IDESourceControlProjectPath + TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + C03F0B00-9A73-4E8C-88E5-1BC53A92AE34 + ../../../.. + + IDESourceControlProjectURL + https://github.com/nasa/XPlaneConnect.git + IDESourceControlProjectVersion + 110 + IDESourceControlProjectWCCIdentifier + C03F0B00-9A73-4E8C-88E5-1BC53A92AE34 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + C03F0B00-9A73-4E8C-88E5-1BC53A92AE34 + IDESourceControlWCCName + XPlaneConnect + + + + diff --git a/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcshareddata/XPC Tests.xccheckout b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcshareddata/XPC Tests.xccheckout new file mode 100644 index 0000000..86d7304 --- /dev/null +++ b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcshareddata/XPC Tests.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 4A17B3D8-572A-4F80-980D-4FB2F0EF3BB4 + IDESourceControlProjectName + XPC Tests + IDESourceControlProjectOriginsDictionary + + 5FCAB004-C765-4A77-A8FD-03E66A1CDF6C + https://github.com/nasa/XPlaneConnect.git + + IDESourceControlProjectPath + TestScripts/XPC Tests/XPC Tests.xcodeproj/project.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + 5FCAB004-C765-4A77-A8FD-03E66A1CDF6C + ../../../.. + + IDESourceControlProjectURL + https://github.com/nasa/XPlaneConnect.git + IDESourceControlProjectVersion + 110 + IDESourceControlProjectWCCIdentifier + 5FCAB004-C765-4A77-A8FD-03E66A1CDF6C + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 5FCAB004-C765-4A77-A8FD-03E66A1CDF6C + IDESourceControlWCCName + XPlaneConnect + + + + diff --git a/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/UserInterfaceState.xcuserstate b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..537c12ffc50452e4e9fe0d82fb9e09c5c5aedead GIT binary patch literal 34178 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 LzxY%7cYyeRkWCnn literal 0 HcmV?d00001 diff --git a/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/WorkspaceSettings.xcsettings b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..659c876 --- /dev/null +++ b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcschemes/XPC Tests.xcscheme b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcschemes/XPC Tests.xcscheme new file mode 100644 index 0000000..294af46 --- /dev/null +++ b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcschemes/XPC Tests.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcschemes/xcschememanagement.plist b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..e8d4ac3 --- /dev/null +++ b/TestScripts/XPC Tests/Cpp Tests.xcodeproj/xcuserdata/cteubert.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + XPC Tests.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + BE9C6BAA1A253FA100EBE08A + + primary + + + + + diff --git a/TestScripts/XPC Tests/XPC Tests/XPC_Tests.1 b/TestScripts/XPC Tests/XPC Tests/XPC_Tests.1 new file mode 100644 index 0000000..6b6d039 --- /dev/null +++ b/TestScripts/XPC Tests/XPC Tests/XPC_Tests.1 @@ -0,0 +1,79 @@ +.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples. +.\"See Also: +.\"man mdoc.samples for a complete listing of options +.\"man mdoc for the short list of editing options +.\"/usr/share/misc/mdoc.template +.Dd 11/25/14 \" DATE +.Dt XPC Tests 1 \" Program name and manual section number +.Os Darwin +.Sh NAME \" Section Header - required - don't modify +.Nm XPC Tests, +.\" The following lines are read in generating the apropos(man -k) database. Use only key +.\" words here as the database is built based on the words here and in the .ND line. +.Nm Other_name_for_same_program(), +.Nm Yet another name for the same program. +.\" Use .Nm macro to designate other names for the documented program. +.Nd This line parsed for whatis database. +.Sh SYNOPSIS \" Section Header - required - don't modify +.Nm +.Op Fl abcd \" [-abcd] +.Op Fl a Ar path \" [-a path] +.Op Ar file \" [file] +.Op Ar \" [file ...] +.Ar arg0 \" Underlined argument - use .Ar anywhere to underline +arg2 ... \" Arguments +.Sh DESCRIPTION \" Section Header - required - don't modify +Use the .Nm macro to refer to your program throughout the man page like such: +.Nm +Underlining is accomplished with the .Ar macro like this: +.Ar underlined text . +.Pp \" Inserts a space +A list of items with descriptions: +.Bl -tag -width -indent \" Begins a tagged list +.It item a \" Each item preceded by .It macro +Description of item a +.It item b +Description of item b +.El \" Ends the list +.Pp +A list of flags and their descriptions: +.Bl -tag -width -indent \" Differs from above in tag removed +.It Fl a \"-a flag as a list item +Description of -a flag +.It Fl b +Description of -b flag +.El \" Ends the list +.Pp +.\" .Sh ENVIRONMENT \" May not be needed +.\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1 +.\" .It Ev ENV_VAR_1 +.\" Description of ENV_VAR_1 +.\" .It Ev ENV_VAR_2 +.\" Description of ENV_VAR_2 +.\" .El +.Sh FILES \" File used or created by the topic of the man page +.Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact +.It Pa /usr/share/file_name +FILE_1 description +.It Pa /Users/joeuser/Library/really_long_file_name +FILE_2 description +.El \" Ends the list +.\" .Sh DIAGNOSTICS \" May not be needed +.\" .Bl -diag +.\" .It Diagnostic Tag +.\" Diagnostic informtion here. +.\" .It Diagnostic Tag +.\" Diagnostic informtion here. +.\" .El +.Sh SEE ALSO +.\" List links in ascending order by section, alphabetically within a section. +.\" Please do not reference files that do not exist without filing a bug report +.Xr a 1 , +.Xr b 1 , +.Xr c 1 , +.Xr a 2 , +.Xr b 2 , +.Xr a 3 , +.Xr b 3 +.\" .Sh BUGS \" Document known, unremedied bugs +.\" .Sh HISTORY \" Document history if command behaves in a unique manner \ No newline at end of file diff --git a/TestScripts/XPC Tests/XPC Tests/main.cpp b/TestScripts/XPC Tests/XPC Tests/main.cpp new file mode 100644 index 0000000..7c756f3 --- /dev/null +++ b/TestScripts/XPC Tests/XPC Tests/main.cpp @@ -0,0 +1,410 @@ +// +// main.cpp +// XPC Tests +// +// Created by Chris Teubert on 11/25/14. +// Copyright (c) 2014 Chris Teubert. All rights reserved. +// + +#include +#include +#include +#include +#include +#include "xplaneconnect.h" + +int testFailed = 0; +int testPassed = 0; + +void runTest(void (*f)()) +{ + try { + std::cout << "Test " << testPassed+testFailed+1<<": "; + (*f)(); // Run Test + std::cout << "PASSED\n"; + testPassed++; + } + catch (int i) + { + std::cerr << "FAILED\n\tError: " << i << std::endl; + testFailed++; + } + catch (char c) + { + std::cerr << "FAILED\n\tError: " << c << std::endl; + testFailed++; + } + +} + +void test1() // openUDP Test +{ + std::cout << "openUDP - "; + struct xpcSocket sendPort = openUDP( 49062, "127.0.0.1", 49009 ); +} + +void test2() // closeUDP test +{ + std::cout << "closeUDP - "; + struct xpcSocket sendPort = openUDP( 49063, "127.0.0.1", 49009 ); + closeUDP(sendPort); +} + +void test3() // send/read Test +{ + std::cout << "send/readUDP - "; + + // Initialization + int i; // Iterator + char test[] = {0, 1, 2, 3}; + char buf[5] = {0}; + struct xpcSocket sendPort, recvPort; + + // Setup + sendPort = openUDP( 49064, "127.0.0.1", 49063 ); + recvPort = openUDP( 49063, "127.0.0.1", 49009 ); + + // Execution + sendUDP( sendPort, test, sizeof(test) ); + readUDP( recvPort, buf, NULL ); // Test + + // Close + closeUDP(sendPort); + closeUDP(recvPort); + + // Tests + for (i=0; i<4; i++) + { + if (test[i] != buf[i]) // Not received correctly + { + throw 1; + } + } + +} + +void test4() // Request DREF Test (Required for next tests) +{ + std::cout << "requestDREF - "; + + // Initialization + int i; // Iterator + char DREFArray[100][100]; + float *recDATA[100]; + short DREFSizes[100]; + struct xpcSocket sendPort, recvPort; + short result = 0; + + // Setup + for (i = 0; i < 100; i++) { + recDATA[i] = (float *) malloc(40*sizeof(float)); + memset(DREFArray[i],0,100); + } + sendPort = openUDP( 49064, "127.0.0.1", 49009 ); + recvPort = openUDP( 49008, "127.0.0.1", 49009 ); + strcpy(DREFArray[0],"sim/cockpit/switches/gear_handle_status"); + strcpy(DREFArray[1],"cockpit2/switches/panel_brightness_ratio"); + for (i=0;i<2;i++) { + DREFSizes[i] = (int) strlen(DREFArray[i]); + } + + // Execution + result = requestDREF(sendPort, recvPort, DREFArray, DREFSizes, 2, recDATA, DREFSizes); + + // Close + closeUDP(sendPort); + closeUDP(recvPort); + + // Tests + if ( result < 0)// Request 2 values + { + throw 1; + } + if (DREFSizes[0] != 1 || DREFSizes[1] != 4) + { + throw 2; + } +} + +void test5() // sendDREF test +{ + std::cout << "sendDREF - "; + + // Initialization + int i; // Iterator + char DREFArray[100][100]; + float *recDATA[100]; + short DREFSizes[100]; + float value = 0.0; + struct xpcSocket sendPort, recvPort; + short result = 0; + + // Setup + for (i = 0; i < 100; i++) { + recDATA[i] = (float *) malloc(40*sizeof(float)); + memset(DREFArray[i],0,100); + } + sendPort = openUDP( 49066, "127.0.0.1", 49009 ); + recvPort = openUDP( 49008, "127.0.0.1", 49009 ); + strcpy(DREFArray[0],"sim/cockpit/switches/gear_handle_status"); + for (i=0;i<1;i++) { + DREFSizes[i] = (int) strlen(DREFArray[i]); + } + + // Execution + sendDREF(sendPort, DREFArray[0], DREFSizes[0], &value, 1); + result = requestDREF(sendPort, recvPort, DREFArray, DREFSizes, 1, recDATA, DREFSizes); + + // Close + closeUDP(sendPort); + closeUDP(recvPort); + + // Tests + if (result < 0)// Request 1 value + { + throw 1; + } + if (DREFSizes[0] != 1) + { + throw 2; + } + if (*recDATA[0] != value) + { + throw 3; + } +} + +void test6() // sendDATA test +{ + std::cout << "sendData - "; + + // Initialize + int i,j; // Iterator + char DREFArray[100][100]; + float data[4][9] = {0}; + float *recDATA[100]; + short DREFSizes[100]; + struct xpcSocket sendPort, recvPort; + short result = 0; + + // Setup + for (i = 0; i < 100; i++) { + recDATA[i] = (float *) malloc(40*sizeof(float)); + memset(DREFArray[i],0,100); + } + sendPort = openUDP( 49066, "127.0.0.1", 49009 ); + recvPort = openUDP( 49008, "127.0.0.1", 49009 ); + strcpy(DREFArray[0],"sim/aircraft/parts/acf_gear_deploy"); + for (i=0;i<1;i++) { + DREFSizes[i] = (int) strlen(DREFArray[i]); + } + for (i=0;i<4;i++) { // Set array to -999 + for (j=0;j<9;j++) data[i][j] = -999; + } + data[0][0] = 14; // Gear + data[0][1] = 1; + data[0][2] = 0; + + // Execution + sendDATA(sendPort, data, 1); // Gear + result = requestDREF(sendPort, recvPort, DREFArray, DREFSizes, 1, recDATA, DREFSizes); // Test + + // Close + closeUDP(sendPort); + closeUDP(recvPort); + + // Tests + if ( result < 0 )// Request 1 value + { + throw 1; + } + if (DREFSizes[0] != 10) + { + throw 2; + } + if (*recDATA[0] != data[0][1]) + { + throw 3; + } +} + +void test7() // sendCTRL test +{ + std::cout << "sendCTRL - "; + + // Initialize + int i; // Iterator + char DREFArray[100][100]; + float CTRL[5] = {0.0}; + float *recDATA[100]; + short DREFSizes[100]; + struct xpcSocket sendPort, recvPort; + + // Setup + for (i = 0; i < 100; i++) { + recDATA[i] = (float *) malloc(40*sizeof(float)); + memset(DREFArray[i],0,100); + } + sendPort = openUDP( 49067, "127.0.0.1", 49009 ); + recvPort = openUDP( 49008, "127.0.0.1", 49009 ); + strcpy(DREFArray[0],"sim/cockpit/switches/gear_handle_status"); + for (i=0;i<1;i++) { + DREFSizes[i] = (int) strlen(DREFArray[i]); + } + CTRL[3] = 0.8; // Throttle + + // Execute + sendCTRL(sendPort, 4, CTRL); + + // Close + closeUDP(sendPort); + closeUDP(recvPort); + + // Test + +// if (requestDREF(sendPort, recvPort, DREFArray, DREFSizes, 1, recDATA, DREFSizes) < 0)// Request 1 value +// { +// throw 1; +// } +// if (DREFSizes[0] != 1) +// { +// throw 2; +// } +// if (*recDATA[0] != value) +// { +// throw 3; +// } +} + +void test8() // sendPOSI test +{ + std::cout << "sendPOSI - "; + + // Initialization + int i; // Iterator + char DREFArray[100][100]; + float POSI[8] = {0.0}; + float *recDATA[100]; + short DREFSizes[100]; + struct xpcSocket sendPort, recvPort; + + // Setup + for (i = 0; i < 100; i++) { + recDATA[i] = (float *) malloc(40*sizeof(float)); + memset(DREFArray[i],0,100); + } + sendPort = openUDP( 49067, "127.0.0.1", 49009 ); + recvPort = openUDP( 49008, "127.0.0.1", 49009 ); + strcpy(DREFArray[0],"sim/cockpit/switches/gear_handle_status"); + for (i=0;i<1;i++) { + DREFSizes[i] = (int) strlen(DREFArray[i]); + } + POSI[0] = 37.524; // Lat + POSI[1] = -122.06899; // Lon + POSI[2] = 2500; // Alt + POSI[3] = 0; // Pitch + POSI[4] = 0; // Roll + POSI[5] = 0; // Heading + POSI[6] = 1; // Gear + + // Execution + sendPOSI( sendPort, 0, 7, POSI ); + + // Close + closeUDP(sendPort); + closeUDP(recvPort); + + // Test +} + +void test9() // pauseSim test +{ + std::cout << "pauseSim - "; + + // Initialize + struct xpcSocket sendPort, recvPort; + + // Setup + sendPort = openUDP( 49067, "127.0.0.1", 49009 ); + recvPort = openUDP( 49008, "127.0.0.1", 49009 ); + + // Execute + pauseSim(sendPort, 1); + + // Close + closeUDP(sendPort); + closeUDP(recvPort); + + // Test +} + +void test10() // setConn test +{ + std::cout << "setConn - "; + + // Initialize + int i; // Iterator + char DREFArray[100][100]; + float *recDATA[100]; + short DREFSizes[100]; + struct xpcSocket sendPort, recvPort; + short result = 0; + usleep(0); + + // Setup + sendPort = openUDP( 49067, "127.0.0.1", 49009 ); + recvPort = openUDP( 49055, "127.0.0.1", 49009 ); + strcpy(DREFArray[0],"sim/cockpit/switches/gear_handle_status"); + for (i=0;i<1;i++) { + DREFSizes[i] = (int) strlen(DREFArray[i]); + } + + // Execution + setCONN(sendPort, 49055); + result = requestDREF(sendPort, recvPort, DREFArray, DREFSizes, 1, recDATA, DREFSizes); // Test + + // Close + closeUDP(sendPort); + closeUDP(recvPort); + + // Test + if ( result < 0 )// No data received + { + throw 1; + } + + + // Set up for next test + sendPort = openUDP( 49067, "127.0.0.1", 49009 ); + setCONN(sendPort, 49009); + closeUDP(sendPort); +} + +int main(int argc, const char * argv[]) +{ + std::cout << "XPC Tests-cpp "; + +#ifdef _WIN32 + std::cout << "(Windows)\n"; +#elif (__APPLE__) + std::cout << "(Mac) \n"; +#elif (__linux) + std::cout << "(Linux) \n"; +#endif + + runTest(test1); + runTest(test2); + runTest(test3); + runTest(test4); + runTest(test5); + runTest(test6); + runTest(test7); + runTest(test8); + runTest(test9); + runTest(test10); + + std::cout << "----------------\nTest Summary\n\tFailed: " << testFailed << "\n\tPassed: " << testPassed << std::endl; + + return 0; +} +