diff --git a/Sources/MiniProject/BUILD.bazel b/Sources/MiniProject/BUILD.bazel index 98ce2f5..c551986 100644 --- a/Sources/MiniProject/BUILD.bazel +++ b/Sources/MiniProject/BUILD.bazel @@ -1,11 +1,30 @@ -load("@rules_swift//swift:swift.bzl", "swift_binary") +load("@rules_swift//swift:swift.bzl", "swift_binary", "swift_library", "swift_test") + +# Pure, UI-free logic (models, parsing, transforms, formatting). Kept out of the +# binary so it can be exercised by //m323/Sources/MiniProject:RunnerCoreTests. +swift_library( + name = "RunnerCore", + srcs = ["RunnerCore.swift"], + module_name = "RunnerCore", + visibility = ["//visibility:public"], +) swift_binary( name = "StadtRundlauf", srcs = ["main.swift"], data = glob(["data/*.txt"]), visibility = ["//visibility:public"], - deps = ["@swifttui//:SwiftTUI"], + deps = [ + ":RunnerCore", + "@swifttui//:SwiftTUI", + ], +) + +swift_test( + name = "RunnerCoreTests", + srcs = ["RunnerCoreTests.swift"], + visibility = ["//visibility:public"], + deps = [":RunnerCore"], ) # BEGIN GENERATED XCODEPROJ @@ -33,6 +52,7 @@ xcodeproj( tags = ["manual"], extra_files = [":xcodeproj_extra_files"], top_level_targets = [ + "//m323/Sources/MiniProject:RunnerCoreTests", "//m323/Sources/MiniProject:StadtRundlauf", ], ) diff --git a/Sources/MiniProject/MiniProject.xcodeproj/project.pbxproj b/Sources/MiniProject/MiniProject.xcodeproj/project.pbxproj index 45aeab5..e6c6a85 100755 --- a/Sources/MiniProject/MiniProject.xcodeproj/project.pbxproj +++ b/Sources/MiniProject/MiniProject.xcodeproj/project.pbxproj @@ -176,11 +176,19 @@ CreatedOnToolsVersion = 26.6.0; LastSwiftMigration = 9999; }; - 0100FAB81B6F000000000001 = { + 00001E1FC9CF000000000001 = { CreatedOnToolsVersion = 26.6.0; LastSwiftMigration = 9999; }; - 00004EB553A7000000000001 = { + 010021D7AEE9000000000001 = { + CreatedOnToolsVersion = 26.6.0; + LastSwiftMigration = 9999; + }; + 0300FAB81B6F000000000001 = { + CreatedOnToolsVersion = 26.6.0; + LastSwiftMigration = 9999; + }; + 02004EB553A7000000000001 = { CreatedOnToolsVersion = 26.6.0; LastSwiftMigration = 9999; }; @@ -192,11 +200,13 @@ ); targets = ( FF0100000000000000000001 /* BazelDependencies */, - 0100FAB81B6F000000000001 /* StadtRundlauf */, - 00004EB553A7000000000001 /* SwiftTUI */, + 00001E1FC9CF000000000001 /* RunnerCore */, + 010021D7AEE9000000000001 /* RunnerCoreTests */, + 0300FAB81B6F000000000001 /* StadtRundlauf */, + 02004EB553A7000000000001 /* SwiftTUI */, ); }; - 00004EB553A7000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */ = { + 00001E1FC9CF000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -212,84 +222,246 @@ shellScript = "set -euo pipefail\n\nif [[ \"$ACTION\" == \"indexbuild\" ]]; then\n cd \"$SRCROOT\"\n\n \"$BAZEL_INTEGRATION_DIR/generate_index_build_bazel_dependencies.sh\"\nelse\n \"$BAZEL_INTEGRATION_DIR/copy_outputs.sh\" \\\n \"_BazelForcedCompile_.swift\" \\\n \"\"\nfi\n"; showEnvVarsInLog = 0; }; - 00004EB553A7000000000006 /* Sources */ = { + 00001E1FC9CF000000000006 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 00FFC950564A0A8E85DE76AA /* Control.swift in Sources */, - 00FFC927145F56EA91D8C9F9 /* Window.swift in Sources */, - 00FF769EE4F24E03387EE327 /* Control+logTree.swift in Sources */, - 00FF15120A8D075045D0C31A /* Node+logTree.swift in Sources */, - 00FF02DFBDB02EF7CA6730AD /* log.swift in Sources */, - 00FF5E51E93E85114A81C2ED /* AttributeScopes+SwiftTUIAttributes.swift in Sources */, - 00FF9443A13020538EDF8602 /* Cell.swift in Sources */, - 00FF29699AA621079339AEA2 /* CellAttributes.swift in Sources */, - 00FF28471707BD8316B43410 /* Color.swift in Sources */, - 00FFC77584E23F3984779346 /* Edges.swift in Sources */, - 00FF38B4059491987FAEE965 /* Extended.swift in Sources */, - 00FFDC2481C8A9ED7403DE2C /* Position.swift in Sources */, - 00FF69CEE00F16C55B995EA3 /* Rect.swift in Sources */, - 00FF40BBB288C62260CA76C3 /* EscapeSequence.swift in Sources */, - 00FF79AAF9921EE12F892356 /* Layer.swift in Sources */, - 00FF3A4B43C80D488C7CE32B /* LayerDrawing.swift in Sources */, - 00FFF2E0DDE16A7D1010746B /* Renderer.swift in Sources */, - 00FFDFD37AE54401B53A5ABB /* Size.swift in Sources */, - 00FFB7DC9A3293ECE8393A58 /* Binding.swift in Sources */, - 00FF4A4ABC004B5FF5637D01 /* Environment.swift in Sources */, - 00FF3B45C9889ED370565846 /* ObservedObject.swift in Sources */, - 00FF2C946200B58812B667DF /* State.swift in Sources */, - 00FFEE3805EB06CFC8FC03C7 /* View+Environment.swift in Sources */, - 00FF76C198B892A242BACBA0 /* View+ObservableObject.swift in Sources */, - 00FF33C3B2D6D0317F653F20 /* View+State.swift in Sources */, - 00FF49436AF208504407BD30 /* ASCII.swift in Sources */, - 00FFF11402FCE9EA7A96512F /* Application.swift in Sources */, - 00FF1F9002855C61CF31D72C /* ArrowKeyParser.swift in Sources */, - 00FF1BC72723E836422B53B6 /* SwiftTUI.swift in Sources */, - 00FF6E0FF588278BC1C0E96E /* ComposedView.swift in Sources */, - 00FFC7BA845C5AB46EEDD9EC /* GenericView.swift in Sources */, - 00FF24113C0B99C3349F0761 /* LayoutRootView.swift in Sources */, - 00FF8259DABBDE007D9CA96C /* ModifierView.swift in Sources */, - 00FFA88328D15EA01534CBB6 /* Node.swift in Sources */, - 00FFB9C9BAB730C1E9019D6D /* PrimitiveView.swift in Sources */, - 00FF0DE18E6C3150EE967582 /* View.swift in Sources */, - 00FF0428EFF8BC4844DFEEF5 /* Weak.swift in Sources */, - 00FFEE5BFF62FA2C9CE8512D /* WeakSet.swift in Sources */, - 00FF7FEDD08A068D8D066266 /* Button.swift in Sources */, - 00FF89E95841426E895D81E5 /* Color+View.swift in Sources */, - 00FF65FFCD86BF306BEC3471 /* Divider.swift in Sources */, - 00FFAC2EE02A2748301EB053 /* GeometryReader.swift in Sources */, - 00FFF57F463FD5B6941F2333 /* ScrollView.swift in Sources */, - 00FFCEF1BD7F380C94FAADB0 /* Spacer.swift in Sources */, - 00FF23D86E413506C6F7DB25 /* Text.swift in Sources */, - 00FF45B8E101B2B215011288 /* TextField.swift in Sources */, - 00FFE75BB68A3EF17D60E39C /* EmptyView.swift in Sources */, - 00FFAE6A70F1E1714BD84C61 /* ForEach.swift in Sources */, - 00FFC6099114A3970F594B5A /* Group.swift in Sources */, - 00FF86BDBAB1FB01FC69713C /* Background.swift in Sources */, - 00FF0E0C217BCA513AA25E42 /* Bold.swift in Sources */, - 00FF1F7CE9DEE5E71B7FD162 /* Border.swift in Sources */, - 00FF17E30E5E434F1A61B03E /* FixedFrame.swift in Sources */, - 00FF2570965BBE7BAABB7C8F /* FlexibleFrame.swift in Sources */, - 00FF2E046DCFA53B787E8B14 /* ForegroundColor.swift in Sources */, - 00FF159F585DA1FE891AC212 /* Italic.swift in Sources */, - 00FFFD7F86C6332ACFE8E09A /* OnAppear.swift in Sources */, - 00FF4600097791854D5254C8 /* Padding.swift in Sources */, - 00FF7EBE80C2D2F703193AE2 /* SetEnvironment.swift in Sources */, - 00FF187F7C193AE2DC5C0569 /* Strikethrough.swift in Sources */, - 00FF377E17D813E1DF17B011 /* Underline.swift in Sources */, - 00FFD84E8471C8E5126FC9E0 /* Optional+View.swift in Sources */, - 00FF8C1E18A733FD0EE6B012 /* Alignment.swift in Sources */, - 00FF0AA743B1E02D724F5F8C /* Axis.swift in Sources */, - 00FF3907B1397417683BA7FC /* HStack.swift in Sources */, - 00FF814531DF6F008282E112 /* VStack.swift in Sources */, - 00FF5528E4594080E339FE5E /* ZStack.swift in Sources */, - 00FFB8584ED0017DB11DE731 /* TupleView.swift in Sources */, - 00FFB51099CAC91D5F78F022 /* ViewBuilder.swift in Sources */, - 00FF8FA09DB2BD499064AC64 /* _ConditionalView.swift in Sources */, + 00FF1E5231001920CAE02B34 /* RunnerCore.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 00004EB553A7000000000100 /* Debug */ = { + 00001E1FC9CF000000000100 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = arm64; + BAZEL_LABEL = "@@//m323/Sources/MiniProject:RunnerCore"; + BAZEL_OUTPUTS_PRODUCT = "bazel-out/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject/libRunnerCore.a"; + BAZEL_OUTPUTS_PRODUCT_BASENAME = libRunnerCore.a; + BAZEL_PACKAGE_BIN_DIR = "bazel-out/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject"; + BAZEL_TARGET_ID = "@@//m323/Sources/MiniProject:RunnerCore darwin_arm64-dbg-ST-9a5aec5712f9"; + COMPILE_TARGET_NAME = RunnerCore; + MACOSX_DEPLOYMENT_TARGET = 26.5; + OTHER_SWIFT_FLAGS = "-Xcc -working-directory -Xcc $(PROJECT_DIR) -working-directory $(PROJECT_DIR) -enforce-exclusivity=checked -emit-const-values-path bazel-out/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject/RunnerCore_objs/RunnerCore.swift.swiftconstvalues -DDEBUG -Onone -Xfrontend -internalize-at-link -enable-testing -disable-sandbox -file-compilation-dir . -Xcc -iquote -Xcc $(PROJECT_DIR) -Xcc -iquote -Xcc $(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin -Xfrontend -disable-clang-spi -enable-experimental-feature AccessLevelOnImport -static -Xcc -O0 -Xcc -DDEBUG=1 -Xcc -fstack-protector -Xcc -fstack-protector-all -Xfrontend -checked-async-objc-bridging=on"; + PRODUCT_MODULE_NAME = RunnerCore; + PRODUCT_NAME = RunnerCore; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = macosx; + SWIFT_ENABLE_EMIT_CONST_VALUES = NO; + TARGET_NAME = RunnerCore; + }; + name = Debug; + }; + 00001E1FC9CF000000000002 /* Build configuration list for PBXNativeTarget "RunnerCore" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00001E1FC9CF000000000100 /* Debug */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 00001E1FC9CF0000000000FF /* libRunnerCore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRunnerCore.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 00001E1FC9CF000000000001 /* RunnerCore */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00001E1FC9CF000000000002 /* Build configuration list for PBXNativeTarget "RunnerCore" */; + buildPhases = ( + 00001E1FC9CF000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */, + 00001E1FC9CF000000000006 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + 00021E1FC9CFFF0001000000 /* PBXTargetDependency */, + ); + name = RunnerCore; + productName = RunnerCore; + productType = "com.apple.product-type.library.static"; + }; + 010021D7AEE9000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(TARGET_BUILD_DIR)/$(INFOPLIST_PATH)", + ); + name = "Copy Bazel Outputs / Generate Bazel Dependencies (Index Build)"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -euo pipefail\n\nif [[ \"$ACTION\" == \"indexbuild\" ]]; then\n cd \"$SRCROOT\"\n\n \"$BAZEL_INTEGRATION_DIR/generate_index_build_bazel_dependencies.sh\"\nelse\n \"$BAZEL_INTEGRATION_DIR/copy_outputs.sh\" \\\n \"_BazelForcedCompile_.swift\" \\\n \"$BAZEL_INTEGRATION_DIR/xctest.exclude.rsynclist\"\nfi\n"; + showEnvVarsInLog = 0; + }; + 010021D7AEE9000000000005 /* Create Link Dependencies */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(LINK_PARAMS_FILE)", + ); + name = "Create Link Dependencies"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/link.params", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -euo pipefail\n\nif [[ \"${ENABLE_PREVIEWS:-}\" == \"YES\" ]]; then\nperl -pe 's/\\$(\\()?([a-zA-Z_]\\w*)(?(1)\\))/$ENV{$2}/g' \\\n \"$SCRIPT_INPUT_FILE_0\" > \"$SCRIPT_OUTPUT_FILE_0\"\nelse\n touch \"$SCRIPT_OUTPUT_FILE_0\"\nfi\n"; + showEnvVarsInLog = 0; + }; + 010021D7AEE9000000000006 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 01FF0A9B8F2DD54D7DC622F9 /* RunnerCoreTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 010021D7AEE9000000000100 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = arm64; + BAZEL_LABEL = "@@//m323/Sources/MiniProject:RunnerCoreTests"; + BAZEL_OUTPUTS_PRODUCT = "bazel-out/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject/RunnerCoreTests.xctest"; + BAZEL_OUTPUTS_PRODUCT_BASENAME = RunnerCoreTests.xctest; + BAZEL_PACKAGE_BIN_DIR = "bazel-out/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject"; + BAZEL_TARGET_ID = "@@//m323/Sources/MiniProject:RunnerCoreTests darwin_arm64-dbg-ST-9a5aec5712f9"; + COMPILE_TARGET_NAME = RunnerCoreTests; + LINK_PARAMS_FILE = "$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject/RunnerCoreTests.rules_xcodeproj.link.params"; + MACOSX_DEPLOYMENT_TARGET = 26.5; + OTHER_LDFLAGS = "@$(DERIVED_FILE_DIR)/link.params"; + OTHER_SWIFT_FLAGS = "-Xcc -working-directory -Xcc $(PROJECT_DIR) -working-directory $(PROJECT_DIR) -enforce-exclusivity=checked -emit-const-values-path bazel-out/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject/RunnerCoreTests_objs/RunnerCoreTests.swift.swiftconstvalues -DDEBUG -Onone -Xfrontend -internalize-at-link -enable-testing -disable-sandbox -F$(DEVELOPER_DIR)/Platforms/MacOSX.platform/Developer/Library/Frameworks -I$(DEVELOPER_DIR)/Platforms/MacOSX.platform/Developer/usr/lib -file-compilation-dir . -I$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject -plugin-path __BAZEL_SWIFT_TOOLCHAIN_PATH__/usr/lib/swift/host/plugins/testing -Xcc -iquote -Xcc $(PROJECT_DIR) -Xcc -iquote -Xcc $(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin -Xfrontend -disable-clang-spi -enable-experimental-feature AccessLevelOnImport -enable-testing -Xcc -O0 -Xcc -DDEBUG=1 -Xcc -fstack-protector -Xcc -fstack-protector-all -Xfrontend -checked-async-objc-bridging=on"; + PRODUCT_MODULE_NAME = m323_Sources_MiniProject_RunnerCoreTests; + PRODUCT_NAME = RunnerCoreTests; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = macosx; + SWIFT_ENABLE_EMIT_CONST_VALUES = NO; + TARGET_NAME = RunnerCoreTests; + }; + name = Debug; + }; + 010021D7AEE9000000000002 /* Build configuration list for PBXNativeTarget "RunnerCoreTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 010021D7AEE9000000000100 /* Debug */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 010021D7AEE90000000000FF /* RunnerCoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerCoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 010021D7AEE9000000000001 /* RunnerCoreTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 010021D7AEE9000000000002 /* Build configuration list for PBXNativeTarget "RunnerCoreTests" */; + buildPhases = ( + 010021D7AEE9000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */, + 010021D7AEE9000000000005 /* Create Link Dependencies */, + 010021D7AEE9000000000006 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + 010221D7AEE9FF0001000000 /* PBXTargetDependency */, + ); + name = RunnerCoreTests; + productName = RunnerCoreTests; + productReference = 010021D7AEE90000000000FF /* RunnerCoreTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 02004EB553A7000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Bazel Outputs / Generate Bazel Dependencies (Index Build)"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -euo pipefail\n\nif [[ \"$ACTION\" == \"indexbuild\" ]]; then\n cd \"$SRCROOT\"\n\n \"$BAZEL_INTEGRATION_DIR/generate_index_build_bazel_dependencies.sh\"\nelse\n \"$BAZEL_INTEGRATION_DIR/copy_outputs.sh\" \\\n \"_BazelForcedCompile_.swift\" \\\n \"\"\nfi\n"; + showEnvVarsInLog = 0; + }; + 02004EB553A7000000000006 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 02FFC950564A0A8E85DE76AA /* Control.swift in Sources */, + 02FFC927145F56EA91D8C9F9 /* Window.swift in Sources */, + 02FF769EE4F24E03387EE327 /* Control+logTree.swift in Sources */, + 02FF15120A8D075045D0C31A /* Node+logTree.swift in Sources */, + 02FF02DFBDB02EF7CA6730AD /* log.swift in Sources */, + 02FF5E51E93E85114A81C2ED /* AttributeScopes+SwiftTUIAttributes.swift in Sources */, + 02FF9443A13020538EDF8602 /* Cell.swift in Sources */, + 02FF29699AA621079339AEA2 /* CellAttributes.swift in Sources */, + 02FF28471707BD8316B43410 /* Color.swift in Sources */, + 02FFC77584E23F3984779346 /* Edges.swift in Sources */, + 02FF38B4059491987FAEE965 /* Extended.swift in Sources */, + 02FFDC2481C8A9ED7403DE2C /* Position.swift in Sources */, + 02FF69CEE00F16C55B995EA3 /* Rect.swift in Sources */, + 02FF40BBB288C62260CA76C3 /* EscapeSequence.swift in Sources */, + 02FF79AAF9921EE12F892356 /* Layer.swift in Sources */, + 02FF3A4B43C80D488C7CE32B /* LayerDrawing.swift in Sources */, + 02FFF2E0DDE16A7D1010746B /* Renderer.swift in Sources */, + 02FFDFD37AE54401B53A5ABB /* Size.swift in Sources */, + 02FFB7DC9A3293ECE8393A58 /* Binding.swift in Sources */, + 02FF4A4ABC004B5FF5637D01 /* Environment.swift in Sources */, + 02FF3B45C9889ED370565846 /* ObservedObject.swift in Sources */, + 02FF2C946200B58812B667DF /* State.swift in Sources */, + 02FFEE3805EB06CFC8FC03C7 /* View+Environment.swift in Sources */, + 02FF76C198B892A242BACBA0 /* View+ObservableObject.swift in Sources */, + 02FF33C3B2D6D0317F653F20 /* View+State.swift in Sources */, + 02FF49436AF208504407BD30 /* ASCII.swift in Sources */, + 02FFF11402FCE9EA7A96512F /* Application.swift in Sources */, + 02FF1F9002855C61CF31D72C /* ArrowKeyParser.swift in Sources */, + 02FF1BC72723E836422B53B6 /* SwiftTUI.swift in Sources */, + 02FF6E0FF588278BC1C0E96E /* ComposedView.swift in Sources */, + 02FFC7BA845C5AB46EEDD9EC /* GenericView.swift in Sources */, + 02FF24113C0B99C3349F0761 /* LayoutRootView.swift in Sources */, + 02FF8259DABBDE007D9CA96C /* ModifierView.swift in Sources */, + 02FFA88328D15EA01534CBB6 /* Node.swift in Sources */, + 02FFB9C9BAB730C1E9019D6D /* PrimitiveView.swift in Sources */, + 02FF0DE18E6C3150EE967582 /* View.swift in Sources */, + 02FF0428EFF8BC4844DFEEF5 /* Weak.swift in Sources */, + 02FFEE5BFF62FA2C9CE8512D /* WeakSet.swift in Sources */, + 02FF7FEDD08A068D8D066266 /* Button.swift in Sources */, + 02FF89E95841426E895D81E5 /* Color+View.swift in Sources */, + 02FF65FFCD86BF306BEC3471 /* Divider.swift in Sources */, + 02FFAC2EE02A2748301EB053 /* GeometryReader.swift in Sources */, + 02FFF57F463FD5B6941F2333 /* ScrollView.swift in Sources */, + 02FFCEF1BD7F380C94FAADB0 /* Spacer.swift in Sources */, + 02FF23D86E413506C6F7DB25 /* Text.swift in Sources */, + 02FF45B8E101B2B215011288 /* TextField.swift in Sources */, + 02FFE75BB68A3EF17D60E39C /* EmptyView.swift in Sources */, + 02FFAE6A70F1E1714BD84C61 /* ForEach.swift in Sources */, + 02FFC6099114A3970F594B5A /* Group.swift in Sources */, + 02FF86BDBAB1FB01FC69713C /* Background.swift in Sources */, + 02FF0E0C217BCA513AA25E42 /* Bold.swift in Sources */, + 02FF1F7CE9DEE5E71B7FD162 /* Border.swift in Sources */, + 02FF17E30E5E434F1A61B03E /* FixedFrame.swift in Sources */, + 02FF2570965BBE7BAABB7C8F /* FlexibleFrame.swift in Sources */, + 02FF2E046DCFA53B787E8B14 /* ForegroundColor.swift in Sources */, + 02FF159F585DA1FE891AC212 /* Italic.swift in Sources */, + 02FFFD7F86C6332ACFE8E09A /* OnAppear.swift in Sources */, + 02FF4600097791854D5254C8 /* Padding.swift in Sources */, + 02FF7EBE80C2D2F703193AE2 /* SetEnvironment.swift in Sources */, + 02FF187F7C193AE2DC5C0569 /* Strikethrough.swift in Sources */, + 02FF377E17D813E1DF17B011 /* Underline.swift in Sources */, + 02FFD84E8471C8E5126FC9E0 /* Optional+View.swift in Sources */, + 02FF8C1E18A733FD0EE6B012 /* Alignment.swift in Sources */, + 02FF0AA743B1E02D724F5F8C /* Axis.swift in Sources */, + 02FF3907B1397417683BA7FC /* HStack.swift in Sources */, + 02FF814531DF6F008282E112 /* VStack.swift in Sources */, + 02FF5528E4594080E339FE5E /* ZStack.swift in Sources */, + 02FFB8584ED0017DB11DE731 /* TupleView.swift in Sources */, + 02FFB51099CAC91D5F78F022 /* ViewBuilder.swift in Sources */, + 02FF8FA09DB2BD499064AC64 /* _ConditionalView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 02004EB553A7000000000100 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = arm64; @@ -310,32 +482,32 @@ }; name = Debug; }; - 00004EB553A7000000000002 /* Build configuration list for PBXNativeTarget "SwiftTUI" */ = { + 02004EB553A7000000000002 /* Build configuration list for PBXNativeTarget "SwiftTUI" */ = { isa = XCConfigurationList; buildConfigurations = ( - 00004EB553A7000000000100 /* Debug */, + 02004EB553A7000000000100 /* Debug */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - 00004EB553A70000000000FF /* libSwiftTUI.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSwiftTUI.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 00004EB553A7000000000001 /* SwiftTUI */ = { + 02004EB553A70000000000FF /* libSwiftTUI.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSwiftTUI.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 02004EB553A7000000000001 /* SwiftTUI */ = { isa = PBXNativeTarget; - buildConfigurationList = 00004EB553A7000000000002 /* Build configuration list for PBXNativeTarget "SwiftTUI" */; + buildConfigurationList = 02004EB553A7000000000002 /* Build configuration list for PBXNativeTarget "SwiftTUI" */; buildPhases = ( - 00004EB553A7000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */, - 00004EB553A7000000000006 /* Sources */, + 02004EB553A7000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */, + 02004EB553A7000000000006 /* Sources */, ); buildRules = ( ); dependencies = ( - 00024EB553A7FF0001000000 /* PBXTargetDependency */, + 02024EB553A7FF0001000000 /* PBXTargetDependency */, ); name = SwiftTUI; productName = SwiftTUI; productType = "com.apple.product-type.library.static"; }; - 0100FAB81B6F000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */ = { + 0300FAB81B6F000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -351,7 +523,7 @@ shellScript = "set -euo pipefail\n\nif [[ \"$ACTION\" == \"indexbuild\" ]]; then\n cd \"$SRCROOT\"\n\n \"$BAZEL_INTEGRATION_DIR/generate_index_build_bazel_dependencies.sh\"\nelse\n \"$BAZEL_INTEGRATION_DIR/copy_outputs.sh\" \\\n \"_BazelForcedCompile_.swift\" \\\n \"\"\nfi\n"; showEnvVarsInLog = 0; }; - 0100FAB81B6F000000000005 /* Create Link Dependencies */ = { + 0300FAB81B6F000000000005 /* Create Link Dependencies */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -368,15 +540,15 @@ shellScript = "set -euo pipefail\n\nif [[ \"${ENABLE_PREVIEWS:-}\" == \"YES\" ]]; then\nperl -pe 's/\\$(\\()?([a-zA-Z_]\\w*)(?(1)\\))/$ENV{$2}/g' \\\n \"$SCRIPT_INPUT_FILE_0\" > \"$SCRIPT_OUTPUT_FILE_0\"\nelse\n touch \"$SCRIPT_OUTPUT_FILE_0\"\nfi\n"; showEnvVarsInLog = 0; }; - 0100FAB81B6F000000000006 /* Sources */ = { + 0300FAB81B6F000000000006 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 01FF556AC73989CC680307A3 /* main.swift in Sources */, + 03FF556AC73989CC680307A3 /* main.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 0100FAB81B6F000000000100 /* Debug */ = { + 0300FAB81B6F000000000100 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = arm64; @@ -390,7 +562,7 @@ LINK_PARAMS_FILE = "$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject/StadtRundlauf.rules_xcodeproj.link.params"; MACOSX_DEPLOYMENT_TARGET = 26.5; OTHER_LDFLAGS = "@$(DERIVED_FILE_DIR)/link.params"; - OTHER_SWIFT_FLAGS = "-Xcc -working-directory -Xcc $(PROJECT_DIR) -working-directory $(PROJECT_DIR) -enforce-exclusivity=checked -emit-const-values-path bazel-out/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject/StadtRundlauf_objs/main.swift.swiftconstvalues -DDEBUG -Onone -Xfrontend -internalize-at-link -enable-testing -disable-sandbox -file-compilation-dir . -I$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin/external/+http_archive+swifttui -Xcc -iquote -Xcc $(PROJECT_DIR) -Xcc -iquote -Xcc $(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin -Xfrontend -disable-clang-spi -enable-experimental-feature AccessLevelOnImport -Xfrontend -entry-point-function-name -Xfrontend m323_Sources_MiniProject_StadtRundlauf_main -Xcc -O0 -Xcc -DDEBUG=1 -Xcc -fstack-protector -Xcc -fstack-protector-all -Xfrontend -checked-async-objc-bridging=on"; + OTHER_SWIFT_FLAGS = "-Xcc -working-directory -Xcc $(PROJECT_DIR) -working-directory $(PROJECT_DIR) -enforce-exclusivity=checked -emit-const-values-path bazel-out/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject/StadtRundlauf_objs/main.swift.swiftconstvalues -DDEBUG -Onone -Xfrontend -internalize-at-link -enable-testing -disable-sandbox -file-compilation-dir . -I$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject -I$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin/external/+http_archive+swifttui -Xcc -iquote -Xcc $(PROJECT_DIR) -Xcc -iquote -Xcc $(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin -Xfrontend -disable-clang-spi -enable-experimental-feature AccessLevelOnImport -Xfrontend -entry-point-function-name -Xfrontend m323_Sources_MiniProject_StadtRundlauf_main -Xcc -O0 -Xcc -DDEBUG=1 -Xcc -fstack-protector -Xcc -fstack-protector-all -Xfrontend -checked-async-objc-bridging=on"; PRODUCT_MODULE_NAME = m323_Sources_MiniProject_StadtRundlauf; PRODUCT_NAME = StadtRundlauf; SDKROOT = macosx; @@ -400,58 +572,84 @@ }; name = Debug; }; - 0100FAB81B6F000000000002 /* Build configuration list for PBXNativeTarget "StadtRundlauf" */ = { + 0300FAB81B6F000000000002 /* Build configuration list for PBXNativeTarget "StadtRundlauf" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0100FAB81B6F000000000100 /* Debug */, + 0300FAB81B6F000000000100 /* Debug */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - 0100FAB81B6F0000000000FF /* StadtRundlauf */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = StadtRundlauf; sourceTree = BUILT_PRODUCTS_DIR; }; - 0100FAB81B6F000000000001 /* StadtRundlauf */ = { + 0300FAB81B6F0000000000FF /* StadtRundlauf */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = StadtRundlauf; sourceTree = BUILT_PRODUCTS_DIR; }; + 0300FAB81B6F000000000001 /* StadtRundlauf */ = { isa = PBXNativeTarget; - buildConfigurationList = 0100FAB81B6F000000000002 /* Build configuration list for PBXNativeTarget "StadtRundlauf" */; + buildConfigurationList = 0300FAB81B6F000000000002 /* Build configuration list for PBXNativeTarget "StadtRundlauf" */; buildPhases = ( - 0100FAB81B6F000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */, - 0100FAB81B6F000000000005 /* Create Link Dependencies */, - 0100FAB81B6F000000000006 /* Sources */, + 0300FAB81B6F000000000003 /* Copy Bazel Outputs / Generate Bazel Dependencies (Index Build) */, + 0300FAB81B6F000000000005 /* Create Link Dependencies */, + 0300FAB81B6F000000000006 /* Sources */, ); buildRules = ( ); dependencies = ( - 0102FAB81B6FFF0001000000 /* PBXTargetDependency */, + 0302FAB81B6FFF0001000000 /* PBXTargetDependency */, ); name = StadtRundlauf; productName = StadtRundlauf; - productReference = 0100FAB81B6F0000000000FF /* StadtRundlauf */; + productReference = 0300FAB81B6F0000000000FF /* StadtRundlauf */; productType = "com.apple.product-type.tool"; }; - 0101FAB81B6FFF0001000000 /* PBXContainerItemProxy */ = { + 00011E1FC9CFFF0001000000 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = FF0000000000000000000001 /* Project object */; proxyType = 1; remoteGlobalIDString = FF0100000000000000000001; remoteInfo = BazelDependencies; }; - 0102FAB81B6FFF0001000000 /* PBXTargetDependency */ = { + 00021E1FC9CFFF0001000000 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = BazelDependencies; target = FF0100000000000000000001 /* BazelDependencies */; - targetProxy = 0101FAB81B6FFF0001000000 /* PBXContainerItemProxy */; + targetProxy = 00011E1FC9CFFF0001000000 /* PBXContainerItemProxy */; }; - 00014EB553A7FF0001000000 /* PBXContainerItemProxy */ = { + 010121D7AEE9FF0001000000 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = FF0000000000000000000001 /* Project object */; proxyType = 1; remoteGlobalIDString = FF0100000000000000000001; remoteInfo = BazelDependencies; }; - 00024EB553A7FF0001000000 /* PBXTargetDependency */ = { + 010221D7AEE9FF0001000000 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = BazelDependencies; target = FF0100000000000000000001 /* BazelDependencies */; - targetProxy = 00014EB553A7FF0001000000 /* PBXContainerItemProxy */; + targetProxy = 010121D7AEE9FF0001000000 /* PBXContainerItemProxy */; + }; + 0301FAB81B6FFF0001000000 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = FF0000000000000000000001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = FF0100000000000000000001; + remoteInfo = BazelDependencies; + }; + 0302FAB81B6FFF0001000000 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = BazelDependencies; + target = FF0100000000000000000001 /* BazelDependencies */; + targetProxy = 0301FAB81B6FFF0001000000 /* PBXContainerItemProxy */; + }; + 02014EB553A7FF0001000000 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = FF0000000000000000000001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = FF0100000000000000000001; + remoteInfo = BazelDependencies; + }; + 02024EB553A7FF0001000000 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = BazelDependencies; + target = FF0100000000000000000001 /* BazelDependencies */; + targetProxy = 02014EB553A7FF0001000000 /* PBXContainerItemProxy */; }; FF0000000000000000000003 /* /Users/cediackermann/Projects */ = { isa = PBXGroup; @@ -477,6 +675,7 @@ sourceTree = ""; }; FE0FE8D7E60C3D79B2E83B9C /* ViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewBuilder.swift; sourceTree = ""; }; + FE11C25A4188C21B80521AF7 /* RunnerCore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerCore.swift; sourceTree = ""; }; FE1459FA19AD7E743575B55F /* Sources */ = { isa = PBXGroup; children = ( @@ -633,6 +832,8 @@ FE4EC1526AFF23247D74D7E5 /* data */, FE91213EB706159A32807EEC /* BUILD.bazel */, FE359F43A055950CD2C4031A /* main.swift */, + FE11C25A4188C21B80521AF7 /* RunnerCore.swift */, + FEE8E2B18F627E26CA07D99A /* RunnerCoreTests.swift */, ); path = MiniProject; sourceTree = ""; @@ -734,6 +935,7 @@ FED14FCCEFFF6DEE187B47AF /* WeakSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeakSet.swift; sourceTree = ""; }; FED4C93198EC989AFB18C04D /* Edges.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Edges.swift; sourceTree = ""; }; FEDEA3D2E3B24689EE2C2D07 /* View+Environment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Environment.swift"; sourceTree = ""; }; + FEE8E2B18F627E26CA07D99A /* RunnerCoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerCoreTests.swift; sourceTree = ""; }; FEEB3ECD861EEC2801B03652 /* State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = State.swift; sourceTree = ""; }; FEEC8BA2E9A611FB242868D5 /* LayoutRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutRootView.swift; sourceTree = ""; }; FEF05B9E4558F03213B7E607 /* SwiftTUI */ = { @@ -764,82 +966,86 @@ path = ../../external; sourceTree = SOURCE_ROOT; }; - 00FF02DFBDB02EF7CA6730AD /* log.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE06B75F1D71891F3D634B95 /* log.swift */; }; - 00FF0428EFF8BC4844DFEEF5 /* Weak.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE9FB11AE896BAE161926281 /* Weak.swift */; }; - 00FF0AA743B1E02D724F5F8C /* Axis.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED12C36473686FE93CB971C /* Axis.swift */; }; - 00FF0DE18E6C3150EE967582 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE97FC495C03EB6918A8AA5B /* View.swift */; }; - 00FF0E0C217BCA513AA25E42 /* Bold.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE565F9C1E240AF078068CC4 /* Bold.swift */; }; - 00FF15120A8D075045D0C31A /* Node+logTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE5C2DBA399E0612A054BE2E /* Node+logTree.swift */; }; - 00FF159F585DA1FE891AC212 /* Italic.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE579D8399C4C1DCC8EED430 /* Italic.swift */; }; - 00FF17E30E5E434F1A61B03E /* FixedFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE3DF55F9C9C4BC3D6031FE4 /* FixedFrame.swift */; }; - 00FF187F7C193AE2DC5C0569 /* Strikethrough.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE0833F786CD2A2EF231EBE5 /* Strikethrough.swift */; }; - 00FF1BC72723E836422B53B6 /* SwiftTUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE25780E4212F6D462FB9149 /* SwiftTUI.swift */; }; - 00FF1F7CE9DEE5E71B7FD162 /* Border.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEB681E54A115EA32E615BFB /* Border.swift */; }; - 00FF1F9002855C61CF31D72C /* ArrowKeyParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEA362915EE372841E810442 /* ArrowKeyParser.swift */; }; - 00FF23D86E413506C6F7DB25 /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE669B47061526964E8012FF /* Text.swift */; }; - 00FF24113C0B99C3349F0761 /* LayoutRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEEC8BA2E9A611FB242868D5 /* LayoutRootView.swift */; }; - 00FF2570965BBE7BAABB7C8F /* FlexibleFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE6CB92FA70E5A7EE190EB1E /* FlexibleFrame.swift */; }; - 00FF28471707BD8316B43410 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE9B6E8AD18CF510CC2C3174 /* Color.swift */; }; - 00FF29699AA621079339AEA2 /* CellAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEB71BE6A8588DC0A820ED8E /* CellAttributes.swift */; }; - 00FF2C946200B58812B667DF /* State.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEEB3ECD861EEC2801B03652 /* State.swift */; }; - 00FF2E046DCFA53B787E8B14 /* ForegroundColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE94FB30E7CAB9941E04149F /* ForegroundColor.swift */; }; - 00FF33C3B2D6D0317F653F20 /* View+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28ED61A3E441791C892614 /* View+State.swift */; }; - 00FF377E17D813E1DF17B011 /* Underline.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE3348E7805B88D20C67D624 /* Underline.swift */; }; - 00FF38B4059491987FAEE965 /* Extended.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE981D88F74E1B0E237FF17A /* Extended.swift */; }; - 00FF3907B1397417683BA7FC /* HStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1D5FAB1C88913D40911281 /* HStack.swift */; }; - 00FF3A4B43C80D488C7CE32B /* LayerDrawing.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE6C1FBF148386BCCB815946 /* LayerDrawing.swift */; }; - 00FF3B45C9889ED370565846 /* ObservedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE0256EB086C79D047D00FE0 /* ObservedObject.swift */; }; - 00FF40BBB288C62260CA76C3 /* EscapeSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE9FA50882B24965E3924A03 /* EscapeSequence.swift */; }; - 00FF45B8E101B2B215011288 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEFEB64A0F9ECD99B9D903B6 /* TextField.swift */; }; - 00FF4600097791854D5254C8 /* Padding.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE406681BF50D14C2B003EFA /* Padding.swift */; }; - 00FF49436AF208504407BD30 /* ASCII.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE97AC026E7A91BD7F6FADDF /* ASCII.swift */; }; - 00FF4A4ABC004B5FF5637D01 /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEC35B1294C0C3A5487073C1 /* Environment.swift */; }; - 00FF5528E4594080E339FE5E /* ZStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = FECF34CCEB582E63F618344C /* ZStack.swift */; }; - 00FF5E51E93E85114A81C2ED /* AttributeScopes+SwiftTUIAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7E6DAF3716429D85DF1CB4 /* AttributeScopes+SwiftTUIAttributes.swift */; }; - 00FF65FFCD86BF306BEC3471 /* Divider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE8F75BC675A850D30B1DFF7 /* Divider.swift */; }; - 00FF69CEE00F16C55B995EA3 /* Rect.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7ADB44C83312F759326BC8 /* Rect.swift */; }; - 00FF6E0FF588278BC1C0E96E /* ComposedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE36B7FB4825960CFD1EE9A0 /* ComposedView.swift */; }; - 00FF769EE4F24E03387EE327 /* Control+logTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE9EBAED75B41BFE5B66EF7B /* Control+logTree.swift */; }; - 00FF76C198B892A242BACBA0 /* View+ObservableObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEA171F995F100B4E80C25E3 /* View+ObservableObject.swift */; }; - 00FF79AAF9921EE12F892356 /* Layer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE59CDA3C4C23D3DCD619C36 /* Layer.swift */; }; - 00FF7EBE80C2D2F703193AE2 /* SetEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE39E81DC7BE1BDBF278368B /* SetEnvironment.swift */; }; - 00FF7FEDD08A068D8D066266 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE56EC4E9A199BCE5A4F11A9 /* Button.swift */; }; - 00FF814531DF6F008282E112 /* VStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE8A46FC66E9580571ECE3D7 /* VStack.swift */; }; - 00FF8259DABBDE007D9CA96C /* ModifierView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1D3E792C9AB2D0FEA7D0A2 /* ModifierView.swift */; }; - 00FF86BDBAB1FB01FC69713C /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEF5075DC088803278713767 /* Background.swift */; }; - 00FF89E95841426E895D81E5 /* Color+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE87BA54DCED0BC71F4DDCBC /* Color+View.swift */; }; - 00FF8C1E18A733FD0EE6B012 /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE78B3B9FF062FE5A86D10CB /* Alignment.swift */; }; - 00FF8FA09DB2BD499064AC64 /* _ConditionalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7CE4A8C0BEDBFEB07D7052 /* _ConditionalView.swift */; }; - 00FF9443A13020538EDF8602 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE88BA287622CAA44EEFBB05 /* Cell.swift */; }; - 00FFA88328D15EA01534CBB6 /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE955B7713691568C9113C22 /* Node.swift */; }; - 00FFAC2EE02A2748301EB053 /* GeometryReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE04B709B3969540B2E9FBF6 /* GeometryReader.swift */; }; - 00FFAE6A70F1E1714BD84C61 /* ForEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE645B3378625EF192815274 /* ForEach.swift */; }; - 00FFB51099CAC91D5F78F022 /* ViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE0FE8D7E60C3D79B2E83B9C /* ViewBuilder.swift */; }; - 00FFB7DC9A3293ECE8393A58 /* Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE24A664919669AC0926796A /* Binding.swift */; }; - 00FFB8584ED0017DB11DE731 /* TupleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE6E5D2B3020404DBED9B8FA /* TupleView.swift */; }; - 00FFB9C9BAB730C1E9019D6D /* PrimitiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FECDEC291E284E1243C69040 /* PrimitiveView.swift */; }; - 00FFC6099114A3970F594B5A /* Group.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEF83A958022D95AB0510862 /* Group.swift */; }; - 00FFC77584E23F3984779346 /* Edges.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED4C93198EC989AFB18C04D /* Edges.swift */; }; - 00FFC7BA845C5AB46EEDD9EC /* GenericView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEAF08A52EEFA7CD8D7ACB91 /* GenericView.swift */; }; - 00FFC927145F56EA91D8C9F9 /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE335FCA49CCC6A3C60B53B5 /* Window.swift */; }; - 00FFC950564A0A8E85DE76AA /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE2F2B1FD47D4F1B77B16984 /* Control.swift */; }; - 00FFCEF1BD7F380C94FAADB0 /* Spacer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEFFB379E67528ADA003A9FF /* Spacer.swift */; }; - 00FFD84E8471C8E5126FC9E0 /* Optional+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7B02AD81BAA59E17ABF025 /* Optional+View.swift */; }; - 00FFDC2481C8A9ED7403DE2C /* Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE91AD15BF6BBB472852849F /* Position.swift */; }; - 00FFDFD37AE54401B53A5ABB /* Size.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE866088E045EAB828EAE645 /* Size.swift */; }; - 00FFE75BB68A3EF17D60E39C /* EmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7E35A8870F6ECDB585186F /* EmptyView.swift */; }; - 00FFEE3805EB06CFC8FC03C7 /* View+Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEDEA3D2E3B24689EE2C2D07 /* View+Environment.swift */; }; - 00FFEE5BFF62FA2C9CE8512D /* WeakSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED14FCCEFFF6DEE187B47AF /* WeakSet.swift */; }; - 00FFF11402FCE9EA7A96512F /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE48F0B66A1921E14F62F077 /* Application.swift */; }; - 00FFF2E0DDE16A7D1010746B /* Renderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEB6D73210F2E5F83E8C6A60 /* Renderer.swift */; }; - 00FFF57F463FD5B6941F2333 /* ScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE230A21685D7895A8803FF1 /* ScrollView.swift */; }; - 00FFFD7F86C6332ACFE8E09A /* OnAppear.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE6BA5124AB5DCB7C1C69060 /* OnAppear.swift */; }; - 01FF556AC73989CC680307A3 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE359F43A055950CD2C4031A /* main.swift */; }; + 00FF1E5231001920CAE02B34 /* RunnerCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE11C25A4188C21B80521AF7 /* RunnerCore.swift */; }; + 01FF0A9B8F2DD54D7DC622F9 /* RunnerCoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEE8E2B18F627E26CA07D99A /* RunnerCoreTests.swift */; }; + 02FF02DFBDB02EF7CA6730AD /* log.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE06B75F1D71891F3D634B95 /* log.swift */; }; + 02FF0428EFF8BC4844DFEEF5 /* Weak.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE9FB11AE896BAE161926281 /* Weak.swift */; }; + 02FF0AA743B1E02D724F5F8C /* Axis.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED12C36473686FE93CB971C /* Axis.swift */; }; + 02FF0DE18E6C3150EE967582 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE97FC495C03EB6918A8AA5B /* View.swift */; }; + 02FF0E0C217BCA513AA25E42 /* Bold.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE565F9C1E240AF078068CC4 /* Bold.swift */; }; + 02FF15120A8D075045D0C31A /* Node+logTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE5C2DBA399E0612A054BE2E /* Node+logTree.swift */; }; + 02FF159F585DA1FE891AC212 /* Italic.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE579D8399C4C1DCC8EED430 /* Italic.swift */; }; + 02FF17E30E5E434F1A61B03E /* FixedFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE3DF55F9C9C4BC3D6031FE4 /* FixedFrame.swift */; }; + 02FF187F7C193AE2DC5C0569 /* Strikethrough.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE0833F786CD2A2EF231EBE5 /* Strikethrough.swift */; }; + 02FF1BC72723E836422B53B6 /* SwiftTUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE25780E4212F6D462FB9149 /* SwiftTUI.swift */; }; + 02FF1F7CE9DEE5E71B7FD162 /* Border.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEB681E54A115EA32E615BFB /* Border.swift */; }; + 02FF1F9002855C61CF31D72C /* ArrowKeyParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEA362915EE372841E810442 /* ArrowKeyParser.swift */; }; + 02FF23D86E413506C6F7DB25 /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE669B47061526964E8012FF /* Text.swift */; }; + 02FF24113C0B99C3349F0761 /* LayoutRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEEC8BA2E9A611FB242868D5 /* LayoutRootView.swift */; }; + 02FF2570965BBE7BAABB7C8F /* FlexibleFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE6CB92FA70E5A7EE190EB1E /* FlexibleFrame.swift */; }; + 02FF28471707BD8316B43410 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE9B6E8AD18CF510CC2C3174 /* Color.swift */; }; + 02FF29699AA621079339AEA2 /* CellAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEB71BE6A8588DC0A820ED8E /* CellAttributes.swift */; }; + 02FF2C946200B58812B667DF /* State.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEEB3ECD861EEC2801B03652 /* State.swift */; }; + 02FF2E046DCFA53B787E8B14 /* ForegroundColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE94FB30E7CAB9941E04149F /* ForegroundColor.swift */; }; + 02FF33C3B2D6D0317F653F20 /* View+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28ED61A3E441791C892614 /* View+State.swift */; }; + 02FF377E17D813E1DF17B011 /* Underline.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE3348E7805B88D20C67D624 /* Underline.swift */; }; + 02FF38B4059491987FAEE965 /* Extended.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE981D88F74E1B0E237FF17A /* Extended.swift */; }; + 02FF3907B1397417683BA7FC /* HStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1D5FAB1C88913D40911281 /* HStack.swift */; }; + 02FF3A4B43C80D488C7CE32B /* LayerDrawing.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE6C1FBF148386BCCB815946 /* LayerDrawing.swift */; }; + 02FF3B45C9889ED370565846 /* ObservedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE0256EB086C79D047D00FE0 /* ObservedObject.swift */; }; + 02FF40BBB288C62260CA76C3 /* EscapeSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE9FA50882B24965E3924A03 /* EscapeSequence.swift */; }; + 02FF45B8E101B2B215011288 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEFEB64A0F9ECD99B9D903B6 /* TextField.swift */; }; + 02FF4600097791854D5254C8 /* Padding.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE406681BF50D14C2B003EFA /* Padding.swift */; }; + 02FF49436AF208504407BD30 /* ASCII.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE97AC026E7A91BD7F6FADDF /* ASCII.swift */; }; + 02FF4A4ABC004B5FF5637D01 /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEC35B1294C0C3A5487073C1 /* Environment.swift */; }; + 02FF5528E4594080E339FE5E /* ZStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = FECF34CCEB582E63F618344C /* ZStack.swift */; }; + 02FF5E51E93E85114A81C2ED /* AttributeScopes+SwiftTUIAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7E6DAF3716429D85DF1CB4 /* AttributeScopes+SwiftTUIAttributes.swift */; }; + 02FF65FFCD86BF306BEC3471 /* Divider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE8F75BC675A850D30B1DFF7 /* Divider.swift */; }; + 02FF69CEE00F16C55B995EA3 /* Rect.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7ADB44C83312F759326BC8 /* Rect.swift */; }; + 02FF6E0FF588278BC1C0E96E /* ComposedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE36B7FB4825960CFD1EE9A0 /* ComposedView.swift */; }; + 02FF769EE4F24E03387EE327 /* Control+logTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE9EBAED75B41BFE5B66EF7B /* Control+logTree.swift */; }; + 02FF76C198B892A242BACBA0 /* View+ObservableObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEA171F995F100B4E80C25E3 /* View+ObservableObject.swift */; }; + 02FF79AAF9921EE12F892356 /* Layer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE59CDA3C4C23D3DCD619C36 /* Layer.swift */; }; + 02FF7EBE80C2D2F703193AE2 /* SetEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE39E81DC7BE1BDBF278368B /* SetEnvironment.swift */; }; + 02FF7FEDD08A068D8D066266 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE56EC4E9A199BCE5A4F11A9 /* Button.swift */; }; + 02FF814531DF6F008282E112 /* VStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE8A46FC66E9580571ECE3D7 /* VStack.swift */; }; + 02FF8259DABBDE007D9CA96C /* ModifierView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1D3E792C9AB2D0FEA7D0A2 /* ModifierView.swift */; }; + 02FF86BDBAB1FB01FC69713C /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEF5075DC088803278713767 /* Background.swift */; }; + 02FF89E95841426E895D81E5 /* Color+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE87BA54DCED0BC71F4DDCBC /* Color+View.swift */; }; + 02FF8C1E18A733FD0EE6B012 /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE78B3B9FF062FE5A86D10CB /* Alignment.swift */; }; + 02FF8FA09DB2BD499064AC64 /* _ConditionalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7CE4A8C0BEDBFEB07D7052 /* _ConditionalView.swift */; }; + 02FF9443A13020538EDF8602 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE88BA287622CAA44EEFBB05 /* Cell.swift */; }; + 02FFA88328D15EA01534CBB6 /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE955B7713691568C9113C22 /* Node.swift */; }; + 02FFAC2EE02A2748301EB053 /* GeometryReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE04B709B3969540B2E9FBF6 /* GeometryReader.swift */; }; + 02FFAE6A70F1E1714BD84C61 /* ForEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE645B3378625EF192815274 /* ForEach.swift */; }; + 02FFB51099CAC91D5F78F022 /* ViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE0FE8D7E60C3D79B2E83B9C /* ViewBuilder.swift */; }; + 02FFB7DC9A3293ECE8393A58 /* Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE24A664919669AC0926796A /* Binding.swift */; }; + 02FFB8584ED0017DB11DE731 /* TupleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE6E5D2B3020404DBED9B8FA /* TupleView.swift */; }; + 02FFB9C9BAB730C1E9019D6D /* PrimitiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FECDEC291E284E1243C69040 /* PrimitiveView.swift */; }; + 02FFC6099114A3970F594B5A /* Group.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEF83A958022D95AB0510862 /* Group.swift */; }; + 02FFC77584E23F3984779346 /* Edges.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED4C93198EC989AFB18C04D /* Edges.swift */; }; + 02FFC7BA845C5AB46EEDD9EC /* GenericView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEAF08A52EEFA7CD8D7ACB91 /* GenericView.swift */; }; + 02FFC927145F56EA91D8C9F9 /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE335FCA49CCC6A3C60B53B5 /* Window.swift */; }; + 02FFC950564A0A8E85DE76AA /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE2F2B1FD47D4F1B77B16984 /* Control.swift */; }; + 02FFCEF1BD7F380C94FAADB0 /* Spacer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEFFB379E67528ADA003A9FF /* Spacer.swift */; }; + 02FFD84E8471C8E5126FC9E0 /* Optional+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7B02AD81BAA59E17ABF025 /* Optional+View.swift */; }; + 02FFDC2481C8A9ED7403DE2C /* Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE91AD15BF6BBB472852849F /* Position.swift */; }; + 02FFDFD37AE54401B53A5ABB /* Size.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE866088E045EAB828EAE645 /* Size.swift */; }; + 02FFE75BB68A3EF17D60E39C /* EmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7E35A8870F6ECDB585186F /* EmptyView.swift */; }; + 02FFEE3805EB06CFC8FC03C7 /* View+Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEDEA3D2E3B24689EE2C2D07 /* View+Environment.swift */; }; + 02FFEE5BFF62FA2C9CE8512D /* WeakSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED14FCCEFFF6DEE187B47AF /* WeakSet.swift */; }; + 02FFF11402FCE9EA7A96512F /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE48F0B66A1921E14F62F077 /* Application.swift */; }; + 02FFF2E0DDE16A7D1010746B /* Renderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEB6D73210F2E5F83E8C6A60 /* Renderer.swift */; }; + 02FFF57F463FD5B6941F2333 /* ScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE230A21685D7895A8803FF1 /* ScrollView.swift */; }; + 02FFFD7F86C6332ACFE8E09A /* OnAppear.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE6BA5124AB5DCB7C1C69060 /* OnAppear.swift */; }; + 03FF556AC73989CC680307A3 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE359F43A055950CD2C4031A /* main.swift */; }; FF0000000000000000000004 /* Products */ = { isa = PBXGroup; children = ( - 00004EB553A70000000000FF /* libSwiftTUI.a */, - 0100FAB81B6F0000000000FF /* StadtRundlauf */, + 00001E1FC9CF0000000000FF /* libRunnerCore.a */, + 02004EB553A70000000000FF /* libSwiftTUI.a */, + 010021D7AEE90000000000FF /* RunnerCoreTests.xctest */, + 0300FAB81B6F0000000000FF /* StadtRundlauf */, ); name = Products; sourceTree = ""; diff --git a/Sources/MiniProject/MiniProject.xcodeproj/rules_xcodeproj/bazel/Debug-swift_debug_settings.py b/Sources/MiniProject/MiniProject.xcodeproj/rules_xcodeproj/bazel/Debug-swift_debug_settings.py index f21e620..c75200f 100755 --- a/Sources/MiniProject/MiniProject.xcodeproj/rules_xcodeproj/bazel/Debug-swift_debug_settings.py +++ b/Sources/MiniProject/MiniProject.xcodeproj/rules_xcodeproj/bazel/Debug-swift_debug_settings.py @@ -17,9 +17,20 @@ _BUNDLE_EXTENSIONS = [ _TRIPLE_MATCH = re.compile(r"([^-]+-[^-]+)(-\D+)[^-]*(-.*)?") _SETTINGS = { + "arm64-apple-macosx RunnerCoreTests.xctest/Contents/MacOS/RunnerCoreTests": { + "c": "-iquote$(PROJECT_DIR) -iquote$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin -O0 -DDEBUG=1 -fstack-protector -fstack-protector-all", + "f": [ + "$(DEVELOPER_DIR)/Platforms/MacOSX.platform/Developer/Library/Frameworks", + ], + "s": [ + "$(DEVELOPER_DIR)/Platforms/MacOSX.platform/Developer/usr/lib", + "$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject", + ], + }, "arm64-apple-macosx StadtRundlauf": { "c": "-iquote$(PROJECT_DIR) -iquote$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin -O0 -DDEBUG=1 -fstack-protector -fstack-protector-all", "s": [ + "$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin/m323/Sources/MiniProject", "$(BAZEL_OUT)/darwin_arm64-dbg-ST-9a5aec5712f9/bin/external/+http_archive+swifttui", ], }, diff --git a/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/RunnerCore.xcscheme b/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/RunnerCore.xcscheme new file mode 100644 index 0000000..381c2d5 --- /dev/null +++ b/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/RunnerCore.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/RunnerCoreTests.xcscheme b/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/RunnerCoreTests.xcscheme new file mode 100644 index 0000000..69e6faa --- /dev/null +++ b/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/RunnerCoreTests.xcscheme @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/StadtRundlauf.xcscheme b/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/StadtRundlauf.xcscheme index 2b48562..0a4b3ac 100644 --- a/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/StadtRundlauf.xcscheme +++ b/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/StadtRundlauf.xcscheme @@ -14,7 +14,7 @@ @@ -30,7 +30,7 @@ @@ -48,7 +48,7 @@ buildForAnalyzing = "YES"> @@ -88,7 +88,7 @@ @@ -101,7 +101,7 @@ runnableDebuggingMode = "0"> @@ -136,7 +136,7 @@ @@ -149,7 +149,7 @@ runnableDebuggingMode = "0"> diff --git a/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/SwiftTUI.xcscheme b/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/SwiftTUI.xcscheme index ac62d5a..29a10db 100644 --- a/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/SwiftTUI.xcscheme +++ b/Sources/MiniProject/MiniProject.xcodeproj/xcshareddata/xcschemes/SwiftTUI.xcscheme @@ -14,7 +14,7 @@ @@ -30,7 +30,7 @@ @@ -48,7 +48,7 @@ buildForAnalyzing = "YES"> diff --git a/Sources/MiniProject/RunnerCore.swift b/Sources/MiniProject/RunnerCore.swift new file mode 100644 index 0000000..ad4b982 --- /dev/null +++ b/Sources/MiniProject/RunnerCore.swift @@ -0,0 +1,135 @@ +import Foundation + +// MARK: - Models + +public enum AgeGroup: Int, CustomStringConvertible, CaseIterable { + case junior = 1 + case adult = 2 + case senior = 3 + + public var description: String { + switch self { + case .junior: return "Junior" + case .adult: return "Adult" + case .senior: return "Senior" + } + } +} + +public struct Runner: Equatable { + public let name: String + public let ageGroup: AgeGroup + public let time: String + public let number: Int + + public init(name: String, ageGroup: AgeGroup, time: String, number: Int) { + self.name = name + self.ageGroup = ageGroup + self.time = time + self.number = number + } +} + +public enum SortKey: String, CaseIterable { + case name + case ageGroup + case time + case number + + public func sort(_ lhs: Runner, _ rhs: Runner) -> Bool { + switch self { + case .name: return lhs.name < rhs.name + case .ageGroup: return lhs.ageGroup.rawValue < rhs.ageGroup.rawValue + case .time: return lhs.time < rhs.time + case .number: return lhs.number < rhs.number + } + } +} + +// MARK: - IO + +public func readFile(_ path: String) -> String { + (try? String(contentsOf: URL(fileURLWithPath: path), encoding: .utf8)) ?? "" +} + +// MARK: - Parsing + +public func parseResults(_ content: String, separator: String) -> [Int: String] { + let pairs = content + .components(separatedBy: .newlines) + .compactMap { line -> (Int, String)? in + let cols = line.components(separatedBy: separator) + guard cols.count >= 2, let key = Int(cols[0]) else { return nil } + return (key, cols[1]) + } + return Dictionary(pairs, uniquingKeysWith: { _, last in last }) +} + +public func parseStarters(_ content: String, separator: String) -> [(nr: Int, ageGroup: Int, name: String)] { + content + .components(separatedBy: .newlines) + .compactMap { line in + let cols = line.components(separatedBy: separator) + guard cols.count >= 3, let nr = Int(cols[0]), let ageGroup = Int(cols[1]) + else { return nil } + return (nr: nr, ageGroup: ageGroup, name: cols[2]) + } +} + +public func assembleRunners( + starters: [(nr: Int, ageGroup: Int, name: String)], results: [Int: String] +) -> [Runner] { + starters.compactMap { starter in + guard let time = results[starter.nr], + let group = AgeGroup(rawValue: starter.ageGroup) + else { + return nil + } + return Runner(name: starter.name, ageGroup: group, time: time, number: starter.nr) + } +} + +public func nonParticipants( + starters: [(nr: Int, ageGroup: Int, name: String)], results: [Int: String] +) -> [Runner] { + starters.compactMap { starter in + guard results[starter.nr] == nil, + let group = AgeGroup(rawValue: starter.ageGroup) + else { + return nil + } + return Runner(name: starter.name, ageGroup: group, time: "DNS", number: starter.nr) + } +} + +// MARK: - Transforms + +public func visibleRunners( + _ runners: [Runner], + query: String, + includedGroups: Set, + sortKey: SortKey +) -> [Runner] { + let needle = query.lowercased() + return runners + .filter { includedGroups.contains($0.ageGroup) } + .filter { needle.isEmpty || $0.name.lowercased().contains(needle) } + .sorted(by: sortKey.sort) +} + +public func toggling(_ groups: Set, _ group: AgeGroup) -> Set { + groups.contains(group) ? groups.subtracting([group]) : groups.union([group]) +} + +// MARK: - Formatting + +public func menuLabel(_ text: String, on: Bool) -> String { + on ? "[\(text)]" : " \(text) " +} + +public func formatRow(_ nr: String, _ name: String, _ group: String, _ time: String) -> String { + nr.padding(toLength: 6, withPad: " ", startingAt: 0) + + name.padding(toLength: 22, withPad: " ", startingAt: 0) + + group.padding(toLength: 9, withPad: " ", startingAt: 0) + + time +} diff --git a/Sources/MiniProject/RunnerCoreTests.swift b/Sources/MiniProject/RunnerCoreTests.swift new file mode 100644 index 0000000..9d3473f --- /dev/null +++ b/Sources/MiniProject/RunnerCoreTests.swift @@ -0,0 +1,216 @@ +import Foundation +import Testing + +import RunnerCore + +struct RunnerCoreTests { + + // MARK: - AgeGroup + + @Test func ageGroupDescription() { + #expect(AgeGroup.junior.description == "Junior") + #expect(AgeGroup.adult.description == "Adult") + #expect(AgeGroup.senior.description == "Senior") + } + + @Test func ageGroupRawValueInit() { + #expect(AgeGroup(rawValue: 1) == .junior) + #expect(AgeGroup(rawValue: 3) == .senior) + #expect(AgeGroup(rawValue: 0) == nil) + #expect(AgeGroup(rawValue: 4) == nil) + } + + // MARK: - SortKey.sort + + private func runner(_ name: String, _ group: AgeGroup, _ time: String, _ nr: Int) -> Runner { + Runner(name: name, ageGroup: group, time: time, number: nr) + } + + @Test func sortKeyByName() { + let a = runner("Bob", .adult, "10:00", 2) + let b = runner("Ann", .senior, "09:00", 1) + #expect(SortKey.name.sort(b, a)) + #expect(!SortKey.name.sort(a, b)) + } + + @Test func sortKeyByAgeGroup() { + let junior = runner("X", .junior, "10:00", 5) + let senior = runner("A", .senior, "09:00", 1) + #expect(SortKey.ageGroup.sort(junior, senior)) + #expect(!SortKey.ageGroup.sort(senior, junior)) + } + + @Test func sortKeyByTime() { + let fast = runner("X", .adult, "09:00", 2) + let slow = runner("A", .adult, "10:00", 1) + #expect(SortKey.time.sort(fast, slow)) + } + + @Test func sortKeyByNumber() { + let first = runner("Z", .adult, "10:00", 1) + let second = runner("A", .adult, "09:00", 2) + #expect(SortKey.number.sort(first, second)) + } + + // MARK: - readFile + + @Test func readFileReturnsContents() throws { + let dir = FileManager.default.temporaryDirectory + let url = dir.appendingPathComponent("runnercore-test-\(UUID().uuidString).txt") + try "hello\nworld".write(to: url, atomically: true, encoding: .utf8) + defer { try? FileManager.default.removeItem(at: url) } + + #expect(readFile(url.path) == "hello\nworld") + } + + @Test func readFileMissingReturnsEmpty() { + #expect(readFile("/no/such/path/\(UUID().uuidString)") == "") + } + + // MARK: - parseResults + + @Test func parseResultsValidLines() { + let content = "1\t09:30\n2\t10:15" + let results = parseResults(content, separator: "\t") + #expect(results == [1: "09:30", 2: "10:15"]) + } + + @Test func parseResultsSkipsMalformed() { + let content = "1\t09:30\nnope\n\n3" // "nope" non-int, empty, "3" has <2 cols + let results = parseResults(content, separator: "\t") + #expect(results == [1: "09:30"]) + } + + @Test func parseResultsDuplicateKeyKeepsLast() { + let content = "1\tfirst\n1\tsecond" + let results = parseResults(content, separator: "\t") + #expect(results == [1: "second"]) + } + + // MARK: - parseStarters + + @Test func parseStartersValidLines() { + let content = "1\t2\tAlice\n7\t3\tBob" + let starters = parseStarters(content, separator: "\t") + #expect(starters.count == 2) + #expect(starters[0].nr == 1) + #expect(starters[0].ageGroup == 2) + #expect(starters[0].name == "Alice") + #expect(starters[1].name == "Bob") + } + + @Test func parseStartersSkipsMalformed() { + let content = "1\t2\tAlice\nx\t2\tBad\n5\t2" // non-int nr, too few cols + let starters = parseStarters(content, separator: "\t") + #expect(starters.count == 1) + #expect(starters[0].name == "Alice") + } + + // MARK: - assembleRunners + + @Test func assembleRunnersMatchesResults() { + let starters = [(nr: 1, ageGroup: 2, name: "Alice"), (nr: 2, ageGroup: 3, name: "Bob")] + let results = [1: "09:30", 2: "10:00"] + let runners = assembleRunners(starters: starters, results: results) + #expect(runners.count == 2) + #expect(runners[0] == Runner(name: "Alice", ageGroup: .adult, time: "09:30", number: 1)) + } + + @Test func assembleRunnersSkipsMissingResultAndBadGroup() { + let starters = [ + (nr: 1, ageGroup: 2, name: "Alice"), + (nr: 2, ageGroup: 9, name: "Bob"), + ] + let results = [2: "10:00"] + let runners = assembleRunners(starters: starters, results: results) + #expect(runners.isEmpty) + } + + // MARK: - nonParticipants + + @Test func nonParticipantsGetDNS() { + let starters = [(nr: 1, ageGroup: 2, name: "Alice"), (nr: 2, ageGroup: 3, name: "Bob")] + let results = [2: "10:00"] // only Bob finished + let absent = nonParticipants(starters: starters, results: results) + #expect(absent == [Runner(name: "Alice", ageGroup: .adult, time: "DNS", number: 1)]) + } + + @Test func nonParticipantsSkipsBadGroup() { + let starters = [(nr: 1, ageGroup: 9, name: "Ghost")] + let absent = nonParticipants(starters: starters, results: [:]) + #expect(absent.isEmpty) + } + + // MARK: - visibleRunners + + private var sample: [Runner] { + [ + runner("Alice", .junior, "09:00", 1), + runner("Bob", .adult, "10:00", 2), + runner("Charlie", .senior, "08:00", 3), + ] + } + + @Test func visibleRunnersFiltersByGroup() { + let visible = visibleRunners( + sample, query: "", includedGroups: [.adult], sortKey: .number) + #expect(visible.map(\.name) == ["Bob"]) + } + + @Test func visibleRunnersQueryIsCaseInsensitive() { + let visible = visibleRunners( + sample, query: "aLiC", includedGroups: Set(AgeGroup.allCases), sortKey: .number) + #expect(visible.map(\.name) == ["Alice"]) + } + + @Test func visibleRunnersEmptyQueryReturnsAllSorted() { + let visible = visibleRunners( + sample, query: "", includedGroups: Set(AgeGroup.allCases), sortKey: .time) + #expect(visible.map(\.name) == ["Charlie", "Alice", "Bob"]) + } + + @Test func visibleRunnersEmptyWhenNoGroups() { + let visible = visibleRunners( + sample, query: "", includedGroups: [], sortKey: .number) + #expect(visible.isEmpty) + } + + // MARK: - toggling + + @Test func togglingAddsWhenAbsent() { + #expect(toggling([.junior], .adult) == [.junior, .adult]) + } + + @Test func togglingRemovesWhenPresent() { + #expect(toggling([.junior, .adult], .adult) == [.junior]) + } + + // MARK: - menuLabel + + @Test func menuLabelOn() { + #expect(menuLabel("Name", on: true) == "[Name]") + } + + @Test func menuLabelOff() { + #expect(menuLabel("Name", on: false) == " Name ") + } + + // MARK: - formatRow + + @Test func formatRowPadsColumns() { + let row = formatRow("#1", "Alice", "Junior", "09:00") + #expect(row == "#1 Alice Junior 09:00") + #expect(row == "#1".padding(toLength: 6, withPad: " ", startingAt: 0) + + "Alice".padding(toLength: 22, withPad: " ", startingAt: 0) + + "Junior".padding(toLength: 9, withPad: " ", startingAt: 0) + + "09:00") + } + + @Test func formatRowTruncatesLongFields() { + // padding(toLength:) truncates when the source is longer than the target. + let longName = String(repeating: "x", count: 30) + let row = formatRow("#1", longName, "Junior", "09:00") + #expect(row.contains(String(repeating: "x", count: 22))) + #expect(!row.contains(String(repeating: "x", count: 23))) + } +} diff --git a/Sources/MiniProject/main.swift b/Sources/MiniProject/main.swift index 1adf396..eceae97 100644 --- a/Sources/MiniProject/main.swift +++ b/Sources/MiniProject/main.swift @@ -1,133 +1,7 @@ import Foundation +import RunnerCore import SwiftTUI -// MARK: - Models - -enum AgeGroup: Int, CustomStringConvertible, CaseIterable { - case junior = 1 - case adult = 2 - case senior = 3 - - var description: String { - switch self { - case .junior: return "Junior" - case .adult: return "Adult" - case .senior: return "Senior" - } - } -} - -struct Runner { - let name: String - let ageGroup: AgeGroup - let time: String - let number: Int -} - -enum SortKey: String, CaseIterable { - case name - case ageGroup - case time - case number - - func sort(_ lhs: Runner, _ rhs: Runner) -> Bool { - switch self { - case .name: return lhs.name < rhs.name - case .ageGroup: return lhs.ageGroup.rawValue < rhs.ageGroup.rawValue - case .time: return lhs.time < rhs.time - case .number: return lhs.number < rhs.number - } - } -} - -// MARK: - IO - -func readFile(_ path: String) -> String { - (try? String(contentsOf: URL(fileURLWithPath: path), encoding: .utf8)) ?? "" -} - -// MARK: - Parsing - -func parseResults(_ content: String, separator: String) -> [Int: String] { - let pairs = content - .components(separatedBy: .newlines) - .compactMap { line -> (Int, String)? in - let cols = line.components(separatedBy: separator) - guard cols.count >= 2, let key = Int(cols[0]) else { return nil } - return (key, cols[1]) - } - return Dictionary(pairs, uniquingKeysWith: { _, last in last }) -} - -func parseStarters(_ content: String, separator: String) -> [(nr: Int, ageGroup: Int, name: String)] { - content - .components(separatedBy: .newlines) - .compactMap { line in - let cols = line.components(separatedBy: separator) - guard cols.count >= 3, let nr = Int(cols[0]), let ageGroup = Int(cols[1]) - else { return nil } - return (nr: nr, ageGroup: ageGroup, name: cols[2]) - } -} - -func assembleRunners(starters: [(nr: Int, ageGroup: Int, name: String)], results: [Int: String]) - -> [Runner] -{ - starters.compactMap { starter in - guard let time = results[starter.nr], - let group = AgeGroup(rawValue: starter.ageGroup) - else { - return nil - } - return Runner(name: starter.name, ageGroup: group, time: time, number: starter.nr) - } -} - -func nonParticipants(starters: [(nr: Int, ageGroup: Int, name: String)], results: [Int: String]) - -> [Runner] -{ - starters.compactMap { starter in - guard results[starter.nr] == nil, - let group = AgeGroup(rawValue: starter.ageGroup) - else { - return nil - } - return Runner(name: starter.name, ageGroup: group, time: "DNS", number: starter.nr) - } -} - -// MARK: - Transforms - -func visibleRunners( - _ runners: [Runner], - query: String, - includedGroups: Set, - sortKey: SortKey -) -> [Runner] { - let needle = query.lowercased() - return runners - .filter { includedGroups.contains($0.ageGroup) } - .filter { needle.isEmpty || $0.name.lowercased().contains(needle) } - .sorted(by: sortKey.sort) -} - -func toggling(_ groups: Set, _ group: AgeGroup) -> Set { - groups.contains(group) ? groups.subtracting([group]) : groups.union([group]) -} - -// MARK: - Formatting - -func menuLabel(_ text: String, on: Bool) -> String { - on ? "[\(text)]" : " \(text) " -} - -func formatRow(_ nr: String, _ name: String, _ group: String, _ time: String) -> String { - nr.padding(toLength: 6, withPad: " ", startingAt: 0) - + name.padding(toLength: 22, withPad: " ", startingAt: 0) - + group.padding(toLength: 9, withPad: " ", startingAt: 0) - + time -} - // MARK: - Configuration let resultsURL = "/Users/cediackermann/Projects/m323/Sources/MiniProject/data/results.txt"