From 7028da58b317ee4e41652f88e97819357ea44163 Mon Sep 17 00:00:00 2001 From: Jason Hagglund Date: Fri, 28 Feb 2025 19:10:41 -0600 Subject: [PATCH] WIP: bookmarking my work to get at least some swift testing working with a start on parameterized test cases --- trainer/lib/trainer/test_parser.rb | 11 +- trainer/lib/trainer/xcresult.rb | 30 +- trainer/spec/fixtures/SwiftTesting.junit | 26 + ...EHfABFOup83bXbIv_viFz-58eyVFclUBRZzoNCJQ== | Bin 0 -> 1355 bytes ...uQwt8Wsic-RD8B4aQrJeF9XAC8H_KZWdfARqPTQQ== | Bin 0 -> 367 bytes ...yNyRmf1kgX7KyyhS_oWl4SqJM42_yEpawqEdyF0g== | Bin 0 -> 573 bytes ...vU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== | 1 + ...rxit06S8o5f0e6rUUUbDuJyokwMWiMaANyMOod0Q== | Bin 0 -> 23159 bytes ...KQ1_HxwJUWfsitly0rdG-gTfELKENzOry5SohTzQ== | Bin 0 -> 128 bytes ...1HJIryb5Zr-58n7oxcHywwWs_Q1ZSBaRl2Uzc0HA== | Bin 0 -> 1011 bytes ...raO8Es7ZycQCyz_MPySALBJ8JKL3BTVRTuxf2DYw== | Bin 0 -> 368 bytes ...qBhCgohNIsPBQyi6kTESTYftQ3iulttZwcr1oCWw== | Bin 0 -> 96 bytes ...LZejdKMdQKY9eSMImsfDPoJM7OH0AbjBtHzMNW4g== | Bin 0 -> 206 bytes ...4NsxNa3kPrsD_iUEUUub9Alc5-Hp_YEhDHMqYK3g== | 1 + ...3jmseM8uSbJSkGoGivQQ5tIJZKgRHJ2ducmD20WQ== | Bin 0 -> 72 bytes ...rSurrfyEcFleWzBqicNDNL49or87B4bOeA-5Ag9g== | Bin 0 -> 195 bytes ...i6cknbSBZ6_AbaEXxet1mYJdonkdHLr2eeSByQbg== | Bin 0 -> 4960 bytes ...l2AE_UK2rWXUCaUJ1V5pe0j4WRGIdSNpcO8s3PAA== | Bin 0 -> 1012 bytes ...L4CPJ4fcFTHEgv4VwiykX8NN2Ee7q-0K1iykoEIA== | Bin 0 -> 2188 bytes ...Tz64u0mPQsnDSVwWXKu3QMHdhM0E1Y0XbFtl1Yxg== | Bin 0 -> 7638 bytes ...wL_EwhqN-wuAHAGWXAzaLMXSLlmpyoI8x0LgBzKw== | Bin 0 -> 120 bytes ...meQVBJQEwlGwHKBjacbYdI0eARgsG87FsTZFabGw== | Bin 0 -> 1010 bytes ...uXiE7RM8kRhcwP_2S6F4-NR1UFMir8zp3zJhXILw== | Bin 0 -> 777 bytes ...YENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA== | Bin 0 -> 199 bytes ...Ptx5bkOsIdKzjRA6w2C4U5Hk9uSVIsMDfC3VYvbw== | Bin 0 -> 296 bytes ...R85mAMxXY5VxgqjgBCVxuK0TMsA9qH8Y0VWPapTQ== | Bin 0 -> 272 bytes ...qL59vkSmzZ5MCa_n5u5gAQoHFPm9PNgFzdjpVepg== | Bin 0 -> 367 bytes ...Fskk10dAlKspPZnnNl3jfiIA9rU7YA-d3fBak6vg== | Bin 0 -> 2083 bytes ...EHfABFOup83bXbIv_viFz-58eyVFclUBRZzoNCJQ== | Bin 0 -> 397 bytes ...uQwt8Wsic-RD8B4aQrJeF9XAC8H_KZWdfARqPTQQ== | Bin 0 -> 1 bytes ...yNyRmf1kgX7KyyhS_oWl4SqJM42_yEpawqEdyF0g== | Bin 0 -> 1 bytes ...vU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== | Bin 0 -> 1 bytes ...rxit06S8o5f0e6rUUUbDuJyokwMWiMaANyMOod0Q== | Bin 0 -> 1 bytes ...KQ1_HxwJUWfsitly0rdG-gTfELKENzOry5SohTzQ== | Bin 0 -> 133 bytes ...1HJIryb5Zr-58n7oxcHywwWs_Q1ZSBaRl2Uzc0HA== | Bin 0 -> 1 bytes ...raO8Es7ZycQCyz_MPySALBJ8JKL3BTVRTuxf2DYw== | Bin 0 -> 1 bytes ...qBhCgohNIsPBQyi6kTESTYftQ3iulttZwcr1oCWw== | Bin 0 -> 1 bytes ...LZejdKMdQKY9eSMImsfDPoJM7OH0AbjBtHzMNW4g== | Bin 0 -> 1 bytes ...4NsxNa3kPrsD_iUEUUub9Alc5-Hp_YEhDHMqYK3g== | Bin 0 -> 67 bytes ...3jmseM8uSbJSkGoGivQQ5tIJZKgRHJ2ducmD20WQ== | Bin 0 -> 199 bytes ...rSurrfyEcFleWzBqicNDNL49or87B4bOeA-5Ag9g== | Bin 0 -> 199 bytes ...i6cknbSBZ6_AbaEXxet1mYJdonkdHLr2eeSByQbg== | Bin 0 -> 1 bytes ...l2AE_UK2rWXUCaUJ1V5pe0j4WRGIdSNpcO8s3PAA== | Bin 0 -> 1 bytes ...L4CPJ4fcFTHEgv4VwiykX8NN2Ee7q-0K1iykoEIA== | Bin 0 -> 463 bytes ...Tz64u0mPQsnDSVwWXKu3QMHdhM0E1Y0XbFtl1Yxg== | Bin 0 -> 1 bytes ...wL_EwhqN-wuAHAGWXAzaLMXSLlmpyoI8x0LgBzKw== | Bin 0 -> 133 bytes ...meQVBJQEwlGwHKBjacbYdI0eARgsG87FsTZFabGw== | Bin 0 -> 1 bytes ...uXiE7RM8kRhcwP_2S6F4-NR1UFMir8zp3zJhXILw== | Bin 0 -> 1 bytes ...YENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA== | Bin 0 -> 1 bytes ...Ptx5bkOsIdKzjRA6w2C4U5Hk9uSVIsMDfC3VYvbw== | Bin 0 -> 1 bytes ...R85mAMxXY5VxgqjgBCVxuK0TMsA9qH8Y0VWPapTQ== | Bin 0 -> 1 bytes ...qL59vkSmzZ5MCa_n5u5gAQoHFPm9PNgFzdjpVepg== | Bin 0 -> 1 bytes ...Fskk10dAlKspPZnnNl3jfiIA9rU7YA-d3fBak6vg== | Bin 0 -> 1 bytes .../fixtures/SwiftTesting.xcresult/Info.plist | 29 + .../SwiftTesting.xcresult/database.sqlite3 | Bin 0 -> 245760 bytes trainer/spec/junit_generator_spec.rb | 52 +- trainer/spec/test_parser_spec.rb | 620 ++++++++++-------- 57 files changed, 485 insertions(+), 285 deletions(-) create mode 100644 trainer/spec/fixtures/SwiftTesting.junit create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~0y4VCbrVFFk8_j13t-EiYd0-PRW5kr_nxX-DUAJmyy4RxCEHfABFOup83bXbIv_viFz-58eyVFclUBRZzoNCJQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~3F5E5jYaMNKsZ-KJkadRaYSBZ0UUeGojsdRdAhtYOlx2Y4uQwt8Wsic-RD8B4aQrJeF9XAC8H_KZWdfARqPTQQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~3eYFsAo25EFcn0rWHiD78lTFFszU1FGXwWP_RWtMD7GtffyNyRmf1kgX7KyyhS_oWl4SqJM42_yEpawqEdyF0g== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~AdVSW07moLLeZxhjBH-lUUN3BlLoWFgS_wITNFih4G4NEGrxit06S8o5f0e6rUUUbDuJyokwMWiMaANyMOod0Q== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~CxhRYBgtP6_1O2GJ7RIjnxi7Q_uyrlR6jA3ao4nyw8HwJPKQ1_HxwJUWfsitly0rdG-gTfELKENzOry5SohTzQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~KSvv5tGtjZy6o-IRDaq84UbD1KvawMyPlQ8eQnnY_FpfsA1HJIryb5Zr-58n7oxcHywwWs_Q1ZSBaRl2Uzc0HA== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~KVul-ltKGyDfurvaNjrPpUo-z2B0A0bhQk8DJ5H6izXqDQraO8Es7ZycQCyz_MPySALBJ8JKL3BTVRTuxf2DYw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~L6kj3LHpqW0S9TKONTMK5txXi4VMq3w8G7bkk73sBQtopPqBhCgohNIsPBQyi6kTESTYftQ3iulttZwcr1oCWw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~LxGkkMbqa-WkFMly9asxsPSDYF-5urdabgN7D6jfJYCLfxLZejdKMdQKY9eSMImsfDPoJM7OH0AbjBtHzMNW4g== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~P2grdcnPz5mOTlpXCdHgYEBsm2I4gI-fb0dlSsg6sZ0Yyk4NsxNa3kPrsD_iUEUUub9Alc5-Hp_YEhDHMqYK3g== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~Pn26D8iv4bIuBiz78MwEzDqZqiCA0tiktXOQACFIOlpNZl3jmseM8uSbJSkGoGivQQ5tIJZKgRHJ2ducmD20WQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~U-9R3FQRBx3QsSxpqonM-pvERFzaJW1bYbwIRS1o-bg2CnrSurrfyEcFleWzBqicNDNL49or87B4bOeA-5Ag9g== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~UK44KxJ2pfLaI9w_lriGonbG9xGLUP9WXBMmii_L25McXJi6cknbSBZ6_AbaEXxet1mYJdonkdHLr2eeSByQbg== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~aQbaOGEFCjnYF-N0FSHhIVBNcGp8DDGJSWc5K_mmeyBupSl2AE_UK2rWXUCaUJ1V5pe0j4WRGIdSNpcO8s3PAA== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~bwxBNsVr6SQCABg0yK_RRGiChrFqh24mJjYprxgKT04u2OL4CPJ4fcFTHEgv4VwiykX8NN2Ee7q-0K1iykoEIA== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~f3_tIjqz6r-a2ztx5c4ZMxnUuxYxQMQDUrmvJtfuADzUBZTz64u0mPQsnDSVwWXKu3QMHdhM0E1Y0XbFtl1Yxg== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~f9FmidYmPfcFDOS1qsPzagnzWDP6LEeRMM3GFM11D0wHoawL_EwhqN-wuAHAGWXAzaLMXSLlmpyoI8x0LgBzKw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~i0dWvxL7HlPk9DlQyox1oB0C5SIPrnTHY1o8vpQOxBInw6meQVBJQEwlGwHKBjacbYdI0eARgsG87FsTZFabGw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~lOIcQcUG-BD8eawMbbuKwd-d156ZRbOFir2-gXnRz23kaluXiE7RM8kRhcwP_2S6F4-NR1UFMir8zp3zJhXILw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~p2cN7biB2xoXya2OTV3Ofi70Ak3kG6BxVhYie74-SeZWgBPtx5bkOsIdKzjRA6w2C4U5Hk9uSVIsMDfC3VYvbw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~s70XznCIqqMyq3h0pkzAOusP97K7ONPtsb0XRym2YximLSR85mAMxXY5VxgqjgBCVxuK0TMsA9qH8Y0VWPapTQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~sOOBhiUwRYKp-TuVTYDV0JkgYU98sP79yTw3tMIfWPbhMjqL59vkSmzZ5MCa_n5u5gAQoHFPm9PNgFzdjpVepg== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~u1v7DvnRv0mDDdwSlQ5UYCj1rRRv6RXDsMEmj_n7c6XKHqFskk10dAlKspPZnnNl3jfiIA9rU7YA-d3fBak6vg== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~0y4VCbrVFFk8_j13t-EiYd0-PRW5kr_nxX-DUAJmyy4RxCEHfABFOup83bXbIv_viFz-58eyVFclUBRZzoNCJQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~3F5E5jYaMNKsZ-KJkadRaYSBZ0UUeGojsdRdAhtYOlx2Y4uQwt8Wsic-RD8B4aQrJeF9XAC8H_KZWdfARqPTQQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~3eYFsAo25EFcn0rWHiD78lTFFszU1FGXwWP_RWtMD7GtffyNyRmf1kgX7KyyhS_oWl4SqJM42_yEpawqEdyF0g== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~AdVSW07moLLeZxhjBH-lUUN3BlLoWFgS_wITNFih4G4NEGrxit06S8o5f0e6rUUUbDuJyokwMWiMaANyMOod0Q== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~CxhRYBgtP6_1O2GJ7RIjnxi7Q_uyrlR6jA3ao4nyw8HwJPKQ1_HxwJUWfsitly0rdG-gTfELKENzOry5SohTzQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~KSvv5tGtjZy6o-IRDaq84UbD1KvawMyPlQ8eQnnY_FpfsA1HJIryb5Zr-58n7oxcHywwWs_Q1ZSBaRl2Uzc0HA== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~KVul-ltKGyDfurvaNjrPpUo-z2B0A0bhQk8DJ5H6izXqDQraO8Es7ZycQCyz_MPySALBJ8JKL3BTVRTuxf2DYw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~L6kj3LHpqW0S9TKONTMK5txXi4VMq3w8G7bkk73sBQtopPqBhCgohNIsPBQyi6kTESTYftQ3iulttZwcr1oCWw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~LxGkkMbqa-WkFMly9asxsPSDYF-5urdabgN7D6jfJYCLfxLZejdKMdQKY9eSMImsfDPoJM7OH0AbjBtHzMNW4g== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~P2grdcnPz5mOTlpXCdHgYEBsm2I4gI-fb0dlSsg6sZ0Yyk4NsxNa3kPrsD_iUEUUub9Alc5-Hp_YEhDHMqYK3g== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~Pn26D8iv4bIuBiz78MwEzDqZqiCA0tiktXOQACFIOlpNZl3jmseM8uSbJSkGoGivQQ5tIJZKgRHJ2ducmD20WQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~U-9R3FQRBx3QsSxpqonM-pvERFzaJW1bYbwIRS1o-bg2CnrSurrfyEcFleWzBqicNDNL49or87B4bOeA-5Ag9g== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~UK44KxJ2pfLaI9w_lriGonbG9xGLUP9WXBMmii_L25McXJi6cknbSBZ6_AbaEXxet1mYJdonkdHLr2eeSByQbg== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~aQbaOGEFCjnYF-N0FSHhIVBNcGp8DDGJSWc5K_mmeyBupSl2AE_UK2rWXUCaUJ1V5pe0j4WRGIdSNpcO8s3PAA== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~bwxBNsVr6SQCABg0yK_RRGiChrFqh24mJjYprxgKT04u2OL4CPJ4fcFTHEgv4VwiykX8NN2Ee7q-0K1iykoEIA== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~f3_tIjqz6r-a2ztx5c4ZMxnUuxYxQMQDUrmvJtfuADzUBZTz64u0mPQsnDSVwWXKu3QMHdhM0E1Y0XbFtl1Yxg== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~f9FmidYmPfcFDOS1qsPzagnzWDP6LEeRMM3GFM11D0wHoawL_EwhqN-wuAHAGWXAzaLMXSLlmpyoI8x0LgBzKw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~i0dWvxL7HlPk9DlQyox1oB0C5SIPrnTHY1o8vpQOxBInw6meQVBJQEwlGwHKBjacbYdI0eARgsG87FsTZFabGw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~lOIcQcUG-BD8eawMbbuKwd-d156ZRbOFir2-gXnRz23kaluXiE7RM8kRhcwP_2S6F4-NR1UFMir8zp3zJhXILw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~p2cN7biB2xoXya2OTV3Ofi70Ak3kG6BxVhYie74-SeZWgBPtx5bkOsIdKzjRA6w2C4U5Hk9uSVIsMDfC3VYvbw== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~s70XznCIqqMyq3h0pkzAOusP97K7ONPtsb0XRym2YximLSR85mAMxXY5VxgqjgBCVxuK0TMsA9qH8Y0VWPapTQ== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~sOOBhiUwRYKp-TuVTYDV0JkgYU98sP79yTw3tMIfWPbhMjqL59vkSmzZ5MCa_n5u5gAQoHFPm9PNgFzdjpVepg== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~u1v7DvnRv0mDDdwSlQ5UYCj1rRRv6RXDsMEmj_n7c6XKHqFskk10dAlKspPZnnNl3jfiIA9rU7YA-d3fBak6vg== create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/Info.plist create mode 100644 trainer/spec/fixtures/SwiftTesting.xcresult/database.sqlite3 diff --git a/trainer/lib/trainer/test_parser.rb b/trainer/lib/trainer/test_parser.rb index cf5c4d79b95..624f1a08589 100644 --- a/trainer/lib/trainer/test_parser.rb +++ b/trainer/lib/trainer/test_parser.rb @@ -264,6 +264,11 @@ def summaries_to_data(summaries, failures, output_remove_retry_attempts: false) # Used by store number of passes and failures by identifier # This is used when Xcode 13 (and up) retries tests # The identifier is duplicated until test succeeds or max count is reached + + # HOWEVER: Swift Testing parameterized tests will show up as duplicate identifiers: + # eg. -[FastlaneTrainerSwiftTestingTests parameterizedExampleShouldFail(value:)] + # Treating those as retry attempts means no param test failures show up in the xml, which is bad: + # https://github.com/fastlane/fastlane/issues/29174 tests_by_identifier = {} test_rows = all_tests.map do |test| @@ -295,6 +300,8 @@ def summaries_to_data(summaries, failures, output_remove_retry_attempts: false) # Set failure message if failure found failure = test.find_failure(failures) if failure + # puts "FAILED" + # puts failure.test_case_name test_row[:failures] = [{ file_name: "", line_number: 0, @@ -302,8 +309,9 @@ def summaries_to_data(summaries, failures, output_remove_retry_attempts: false) performance_failure: {}, failure_message: failure.failure_message }] - + # puts info[:failure_count] info[:failure_count] += 1 + # puts info[:failure_count] elsif test.test_status == "Skipped" test_row[:skipped] = true info[:skip_count] += 1 @@ -394,6 +402,7 @@ def parse_content(xcpretty_naming) guid: current_test["TestSummaryGUID"], duration: current_test["Duration"] } + if current_test["FailureSummaries"] current_row[:failures] = current_test["FailureSummaries"].collect do |current_failure| { diff --git a/trainer/lib/trainer/xcresult.rb b/trainer/lib/trainer/xcresult.rb index 934fabd97a2..f6f1b25d2d4 100644 --- a/trainer/lib/trainer/xcresult.rb +++ b/trainer/lib/trainer/xcresult.rb @@ -173,9 +173,15 @@ def all_subtests end def find_failure(failures) - sanitizer = proc { |name| name.gsub(/\W/, "_") } + # Used to sanitize both test case name and identifier for reliable comparison + sanitizer = proc do |name| + name.gsub(/\W/, "_"). # replace all non-word characters with an underscore + gsub(/^_+/, ""). # remove leading underscores, generally a result of Swift Testing parameterized tests + gsub(/_+$/, "") # remove trailing underscores, generally a result of Swift Testing parameterized tests + end sanitized_identifier = sanitizer.call(self.identifier) if self.test_status == "Failure" + # puts "" # Tries to match failure on test case name # Example TestFailureIssueSummary: # producingTarget: "TestThisDude" @@ -186,10 +192,26 @@ def find_failure(failures) # or identifier: "TestThisDude/testFailureJosh2" (when Objective-C) found_failure = failures.find do |failure| - # Sanitize both test case name and identifier in a consistent fashion, then replace all non-word - # chars with underscore, and compare them sanitized_test_case_name = sanitizer.call(failure.test_case_name) - sanitized_identifier == sanitized_test_case_name + + # It's possible that identifier would be prefixed with group name for Swift Testing + # but also...do we need strict equality here, or just enough similarity? + # puts "identifier: #{self.identifier}" + # puts "sanitized_identifier:" + # puts sanitized_identifier + # # puts "test_case_name: #{failure.test_case_name}" + # puts "sanitized_test_case_name:" + # puts sanitized_test_case_name + # sanitized_identifier.end_with?(sanitized_test_case_name) + # puts sanitized_identifier == sanitized_test_case_name + # sanitized_identifier == sanitized_test_case_name + # puts failure.inspect + puts sanitized_identifier + puts sanitized_test_case_name + # puts sanitized_identifier == sanitized_test_case_name + sanitized_identifier == sanitized_test_case_name || sanitized_identifier.end_with?(sanitized_test_case_name) + # puts sanitized_identifier.end_with?(sanitized_test_case_name) + # sanitized_identifier.end_with?(sanitized_test_case_name) end return found_failure else diff --git a/trainer/spec/fixtures/SwiftTesting.junit b/trainer/spec/fixtures/SwiftTesting.junit new file mode 100644 index 00000000000..fb5109888c6 --- /dev/null +++ b/trainer/spec/fixtures/SwiftTesting.junit @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~0y4VCbrVFFk8_j13t-EiYd0-PRW5kr_nxX-DUAJmyy4RxCEHfABFOup83bXbIv_viFz-58eyVFclUBRZzoNCJQ== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~0y4VCbrVFFk8_j13t-EiYd0-PRW5kr_nxX-DUAJmyy4RxCEHfABFOup83bXbIv_viFz-58eyVFclUBRZzoNCJQ== new file mode 100644 index 0000000000000000000000000000000000000000..d09d22c225f8fff4e630466ea59b90d265c6a23c GIT binary patch literal 1355 zcmV-R1+@AowJ-euNEIpoN=`HnDbQxn3_vo;Nl65RRDX3J&HNxh-FbsHOh80BR)lOJ z*Aaf|Z8c*u&FL(YO-~O3VcRXq4HsL6~7j_@R1ZldyzVmere%8C+ zgrkTliYvrB|1Gn>&VTEe&!dgMKRs^0HQ2dM5WE+5AH##9s12O3BOt(?f5*^uWRdYd z%-8pOABJe=@RW2cxMuC(Ir>qKVefwYEZ%*chdZM`4@Z?&?cl+S?)*ERXyzz@9e!Pp zWah){5P>a~bS$`LF0;R}Ygl@Y-Z;t}SB{#)A+^qb>zy7uzf_i6aLr{@xl)f~g)PTa z=JJ2}=yLD1-}KOpZ@y;?1wRAbug8_|QCtBAY~;`J$E3Mnoeb1tw$75lcZ; zK}{qN<#RZeY`clpP*~O#72V??VQ3awVm=B9%HALn1qz71U|Nf)NvB&Q3bGIdMbV_% z0muDFf}c*{iIZJ-jjP(hi)9~QBsr!sH_;t_{o5brtryD;M^r2~0tBkX>=Ggs%=AI4 zP|U(79#6UGKH;>lEsPa=DMv`tBr=bS;#`SEh*cR&+HKJY16xVp zXb2t3It*+KG?#0FVHkACvz63z@k>Q08HC1^Sd>jdZUr$@GEd~w93T*mXPqF<_2q$N zsL{ahe1Lz5{LjK7|M_sz(61b01zMvjKCNqWX2fd z06<_65QPVp3RjXl$sYr=zEYERqV1zZ;9DWq?z9&flqoW*M^eZxm?vmNq-BwsShm?u z!&wfS`k4amcuS4FDm%dK3dD7B$t~aTL{hK&Y1J1kBX*&r<+zubf1ui35q(bzOpLmFa9}!66j~e37#u<%l8CN zkO>WP9SF`}@bh*6ih)l%WbvD_ZJCIdO?Ebj>u1)?^(Dqn%0eQs7UxPAuZX=Q5e;i< zF)X490PJlPu+!hBSXEWH=SN}kO^gSaW|ShZaL9roufhp{QA-Ko+-_gto!~%}zl0$s zphgqcRgA$CFy-K9ybis7s-06Am!ceq_5awTpjac9XK`OfAtRY9MRU)#-3)do=P0#$ NJoxmWRR|0eKM$=bfja;I literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~3F5E5jYaMNKsZ-KJkadRaYSBZ0UUeGojsdRdAhtYOlx2Y4uQwt8Wsic-RD8B4aQrJeF9XAC8H_KZWdfARqPTQQ== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~3F5E5jYaMNKsZ-KJkadRaYSBZ0UUeGojsdRdAhtYOlx2Y4uQwt8Wsic-RD8B4aQrJeF9XAC8H_KZWdfARqPTQQ== new file mode 100644 index 0000000000000000000000000000000000000000..0ea465b303f60673b32935db7c1b1c7da0d646ab GIT binary patch literal 367 zcmV-#0g(PEwJ-euNHq%pW|l=FFl+R)XtNbksV%Euw-kVC{PZn+IG)5FHBhC+x|V{1 zVh}w5Jpeoa3}y~CZA^B671hp8<;AJf;gPDtLMUEr0SOL1?+vvUk&{}4YUj`IM_+D?6>CSVtoVCF zNlR8fAeufN5#g{hN%*~=m$nuV1~d1ff+wLZ2Lk}yBSH|mx0KW4#ix(|-uqcC2Vvu{ z4!0M%L*v`$#B#9jL}w(Z2a)^z)al`6N!CDF4l-U}9d7-Tn;ZZJ7KOsi@iK_KvgzW8 zdw5-KygCC_>EF%Rv?ZipS&*tYlp!E9$|B17AI7G}@H~8)MI0fxB1FUmm@5&cRTm5c Nf~ktLz&DLdkpTu+s}TSI literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~3eYFsAo25EFcn0rWHiD78lTFFszU1FGXwWP_RWtMD7GtffyNyRmf1kgX7KyyhS_oWl4SqJM42_yEpawqEdyF0g== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~3eYFsAo25EFcn0rWHiD78lTFFszU1FGXwWP_RWtMD7GtffyNyRmf1kgX7KyyhS_oWl4SqJM42_yEpawqEdyF0g== new file mode 100644 index 0000000000000000000000000000000000000000..69d90401c02eefccee1971499251db77cb1d4d22 GIT binary patch literal 573 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 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~CxhRYBgtP6_1O2GJ7RIjnxi7Q_uyrlR6jA3ao4nyw8HwJPKQ1_HxwJUWfsitly0rdG-gTfELKENzOry5SohTzQ== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~CxhRYBgtP6_1O2GJ7RIjnxi7Q_uyrlR6jA3ao4nyw8HwJPKQ1_HxwJUWfsitly0rdG-gTfELKENzOry5SohTzQ== new file mode 100644 index 0000000000000000000000000000000000000000..8c13db6fb9989d947e4efe813b0493c92f701f81 GIT binary patch literal 128 zcmV-`0Du1|wJ-euNWB99Qb!scV2c~Wt}Ml#vUVMvG6(yPZdano7{(Sojv)w^3x{WX z(y?3cIPjD7lk-|1>m!e)$(0(PNJ246T!FwiPytwDZ9%l9mZI2Fmh$&?5X1L%pMZ;} im!Y;>*63XaiX(L2C!1V_aykqF0{~i?gNE$ZZP*NKDLXI# literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~KSvv5tGtjZy6o-IRDaq84UbD1KvawMyPlQ8eQnnY_FpfsA1HJIryb5Zr-58n7oxcHywwWs_Q1ZSBaRl2Uzc0HA== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~KSvv5tGtjZy6o-IRDaq84UbD1KvawMyPlQ8eQnnY_FpfsA1HJIryb5Zr-58n7oxcHywwWs_Q1ZSBaRl2Uzc0HA== new file mode 100644 index 0000000000000000000000000000000000000000..2163552a5f03e9ca92d7c0e84519a9fcb38fc558 GIT binary patch literal 1011 zcmV->KoVGzaXSX1V=5_tfdK%|_j_TJI`2c>_+$%Qy4m7h z3`T>;9<^f_`=w-fF9u`f;IT)p#frQa(hT-_WmRR!Z>CdH-7pxL#-6q?)-;aumd4g{ ztX?hRVxk+2P9@n!x~X=)ym{&e#u#6c_pt=hUh)bFgHwr|)coob0<++WZm@D?Rb}Y0 zN7c@kAnmY-I?)YEL=piQd({q%k9GTs(93m6l^48D+Ka&mQ0@Hd7(?2jR3gt9&wkV| zJb_{(JlkO~J~c7013&g?Qs-ljo|+iY^*ZH^yh{359z5EGPmif)I+;j{iU+=qAs)>d zqm$|f#t1bNW2Dv+wEKQwq}CERo|+g?FILF~r&OZJCpD?e4i!o>)vZm@9G+PSDDW#Gb z29rPb>cEdZn*6aZIF=J1>#qpCKol<<5*{X5+7FEQu}9sOiL7Qn7@^fHRS~F_R2AHd z!T6T9H1{~Ct>qYVZfTH2jIMcYHO*UGFE*+3K7_H~X_CD#7`>ABfMFJre27vh^@9;= zhkb^BwFM49Pfn+#0IHoYUvf%@K`+Zh2C*HSUq1BMzZZisE*OEzx8F= zlT~mGM%K)K_Ji?ZS+1wn)9N63jz2?)NL9N5a))*kuuPPh7IQ#+@RTkO2e(=K3dLW?rA# zw#_UA?RdVy;MldC5Tow5NE1z&m$PbNRa@`^yYDk@aC?;$7<<|~Yb-;(fmJ;yhyI6t zYb-IcocqzyM*MiLD$DY%IeVQeV1gLM+~!koSkl1#)G%K$kW1en(M$G)&-O%ZO%I36 z$kZ2?2~Q(HjatKh7NMs83;&M|xU)(wTQK{N1#m>Sq!a;Q@l+kY3r9qkNokX^KBgYp h8^3ky06V{AaS>f*u zAx&8sk!adz#00}i1mX97UfNnXBxdeK2hT!V4h8_YM}-i&x0Kc6#jB71-upRO4#LJ? z9d0jjhsL+h%5t!8MQ1dq36J~z)av17Q5He59BjP4I^6mvHvt>~1{Q_F&G9mbyt3)y zh$O9KNCurY8lFf}kRa&a?paZhn wGu&!ER;{s21k6QHGyWh?T>>8 z^PExxZCeFO^N4jzt`(JoYk4a zK)l}C-0e4>^5$#GDS4-Y9V+^;hbakyGLo=<+73fVGf+Ta3<4N{0|XLag%2VY0vG@d zGfEYhWJX=^up?fHLFN<&2y+hjF{QjQdhdWDgaDHP4fFGE-~_k>jse_2mYMm2!QdJ| IVu0}gicnl$MgRZ+ literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~P2grdcnPz5mOTlpXCdHgYEBsm2I4gI-fb0dlSsg6sZ0Yyk4NsxNa3kPrsD_iUEUUub9Alc5-Hp_YEhDHMqYK3g== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~P2grdcnPz5mOTlpXCdHgYEBsm2I4gI-fb0dlSsg6sZ0Yyk4NsxNa3kPrsD_iUEUUub9Alc5-Hp_YEhDHMqYK3g== new file mode 100644 index 00000000000..9a0adba92e3 --- /dev/null +++ b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~P2grdcnPz5mOTlpXCdHgYEBsm2I4gI-fb0dlSsg6sZ0Yyk4NsxNa3kPrsD_iUEUUub9Alc5-Hp_YEhDHMqYK3g== @@ -0,0 +1 @@ +[{"name":"testmanagerd.log","type":1}] \ No newline at end of file diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~Pn26D8iv4bIuBiz78MwEzDqZqiCA0tiktXOQACFIOlpNZl3jmseM8uSbJSkGoGivQQ5tIJZKgRHJ2ducmD20WQ== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~Pn26D8iv4bIuBiz78MwEzDqZqiCA0tiktXOQACFIOlpNZl3jmseM8uSbJSkGoGivQQ5tIJZKgRHJ2ducmD20WQ== new file mode 100644 index 0000000000000000000000000000000000000000..3ed88b422091d42b49ac3c8cc7a5ba7ea41bdee1 GIT binary patch literal 72 zcmdPcs{fb4<1ZtF3UhR|QeI+is*;tGbADNBQDSqPBSkf^cWl;slEPg?)nKl^_L z!E92aIU10Iq6m$v4%PGma3}lJJD~(dUD)Sw|H~EWTx5%pBaLB;i{T<8I|#od5pr}R x>M(4*5q0jODg;2()(JV(PJ_GvPc!5OR!aZ? literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~UK44KxJ2pfLaI9w_lriGonbG9xGLUP9WXBMmii_L25McXJi6cknbSBZ6_AbaEXxet1mYJdonkdHLr2eeSByQbg== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~UK44KxJ2pfLaI9w_lriGonbG9xGLUP9WXBMmii_L25McXJi6cknbSBZ6_AbaEXxet1mYJdonkdHLr2eeSByQbg== new file mode 100644 index 0000000000000000000000000000000000000000..09536bae4a81411b9990f402ddde829ca66db612 GIT binary patch literal 4960 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 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~aQbaOGEFCjnYF-N0FSHhIVBNcGp8DDGJSWc5K_mmeyBupSl2AE_UK2rWXUCaUJ1V5pe0j4WRGIdSNpcO8s3PAA== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~aQbaOGEFCjnYF-N0FSHhIVBNcGp8DDGJSWc5K_mmeyBupSl2AE_UK2rWXUCaUJ1V5pe0j4WRGIdSNpcO8s3PAA== new file mode 100644 index 0000000000000000000000000000000000000000..a8265c430f1be22c27b12b9f32d05dcc991bf166 GIT binary patch literal 1012 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 OliqL?Y(@ppF&L&rQ6ypj literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~f3_tIjqz6r-a2ztx5c4ZMxnUuxYxQMQDUrmvJtfuADzUBZTz64u0mPQsnDSVwWXKu3QMHdhM0E1Y0XbFtl1Yxg== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~f3_tIjqz6r-a2ztx5c4ZMxnUuxYxQMQDUrmvJtfuADzUBZTz64u0mPQsnDSVwWXKu3QMHdhM0E1Y0XbFtl1Yxg== new file mode 100644 index 0000000000000000000000000000000000000000..99b58f9244644573b91040c0daa9364366d24b85 GIT binary patch literal 7638 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 EKSEZOF#rGn literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~f9FmidYmPfcFDOS1qsPzagnzWDP6LEeRMM3GFM11D0wHoawL_EwhqN-wuAHAGWXAzaLMXSLlmpyoI8x0LgBzKw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~f9FmidYmPfcFDOS1qsPzagnzWDP6LEeRMM3GFM11D0wHoawL_EwhqN-wuAHAGWXAzaLMXSLlmpyoI8x0LgBzKw== new file mode 100644 index 0000000000000000000000000000000000000000..92786eafe00170d0443f717b432e1766f2449de9 GIT binary patch literal 120 zcmV-;0Eho5wJ-euNPPnU!Uh=~U`-uU5Q&Y+CU51cf*X+1@=Sva?D$T@lOU`|bPo~Cmy-s-{uaZ8N2oRRx5=5$*R#Zrf3kbfBBOtxl zqI1#?jPdCu#z?J=wEK2oq}E0rKbaa&t2Idmr&J)x=VVfuA1ajQNi!z(TGh^{%o|}h zsK^qRnprSjOV_Nb<+d@K8;BtG_06dn{f$C^##!v>h1nV~3ix3OUVwFg}XeNll09ys+~XIDSo>#*bA%eT(Z%|!zqO#ACrwBkbdmnZdnQt z5p6*T!C2ImddD=4kCj);e&SY0}KO9gIpb%JH0g zFx78qXF(2gFy&a7V(q*%Xh)gkW1r^tgYk)xSpjaS0i9C@8B+kkj0~hL#z2Cipd#xM zmvcpCDOCJZx$JAnJ0maD<`+|@ z6G)#XZRYdj=HWqai`4rn!8}yse!3DGgsvjP&KJRP#U;6G+^J#-7eKIJuKyEe^6OK@ zwwZ;X5zn_69J`hiY!v$zX~L9wJ*#$BwHhz*`#!%0msjZnqfdLgjb*$yu&f7p=y{m8 z#wbRMb38hTh~Lju(ei)mCte2%m^DTvx49G?mNW=Yo&EX^3CRt5e91ugW={#$bb82) zOMP*f@H7I{sx|m$5NhbZ@c+nwdsfL03ugbZKt%NPOc4MUPu1bOaAfGBlxR|1VJcJG g<6GLU&Ww-N=@{ouZDeGt5DYq`gDupwSW*L~)Ot?mDF6Tf literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~lOIcQcUG-BD8eawMbbuKwd-d156ZRbOFir2-gXnRz23kaluXiE7RM8kRhcwP_2S6F4-NR1UFMir8zp3zJhXILw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~lOIcQcUG-BD8eawMbbuKwd-d156ZRbOFir2-gXnRz23kaluXiE7RM8kRhcwP_2S6F4-NR1UFMir8zp3zJhXILw== new file mode 100644 index 0000000000000000000000000000000000000000..76f45fc52ee5aedf75ced6decb9c1afb5fc1b51e GIT binary patch literal 777 zcmV+k1NQtVwJ-euNCg-GMl+Ho;Izg7L_=&@YDFGGxG4D+Xb6Ubfn&Fz*-2T-Q3etm zF~)eq%nOYGiU4{5Si!r!F~sfr#7H%5S3m5(Ry{+}aPj%5nD~4+WIRMHSS(b4J`bSt zhVCKpGNU9?Y^07ZMd)zlr-R^>re(DT01xJhA=|GyN3NUQT!yk&k1j4FdwNx?#H64prB^ANDEDZc|!qqcOzot7x`sCxTIG zRtb$Rje*2dWf+yIa+)=(f)<9g%C)WlySf0oiIM}1p{I@et$0e zhoY<;w^M69tX^aH=EaaN?HXfienR6DuS3Q#s%HFt*qNhlKE)p4M+-7(duP;at?RCP zVViK;>$=(P+Jnmz9zfC$`&g2^Rc9^W|2K&74Dd3e)K>P81>O%c5#;OU_DL)ZIRF;} zjfRu4WICU+c?>ESi{#NroeRJKFEa{oCf#ht_u471AA(w!Ax>cwF+M5-!RZu`Oafhs z7(XC~QzmZ9Kxs1eIfc^fhoBDS$cIt0F$lF;{Tf7wYaple!*-)nrit5vP@1Y4UwU{o z{d?$^vGay3YhS&_?v!Rf%tSEb9-0luvN9F8bn*g4AW%X=Nt4nW(XPo({7UEC-o#pc^!178C>boOyzaaVuaMB{<|7-@)Mu z0nhcc`Coh&kJxI3BuQFLQbuQ`9)zYa%iv5sjwA($n#B*qcr|HG^HqRGRP)8_%i}qa H)ucHCQe}52 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA== new file mode 100644 index 0000000000000000000000000000000000000000..fdd67e34dc951ab44630a0505b3111970fe21488 GIT binary patch literal 199 zcmV;&0670BwJ-euNc9B(VvQ^!FpKB`I~+T%l}4r)U#UzrZ~8ClfTu(Vp0@eNBt=Gm z1eeNv^*EQ6d&i$;wY)gmkp9T|pxo4v0U*+Opt5gK5@-Z@1%|0=o%Yiv}~` zXx3Mcb1|9(xG;DKR!+eH5(4O82}tCRbfR8NX$wn4(kpF-6`=+N2Lb@#A|OQ~8z~O{ BT#Nt! literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~p2cN7biB2xoXya2OTV3Ofi70Ak3kG6BxVhYie74-SeZWgBPtx5bkOsIdKzjRA6w2C4U5Hk9uSVIsMDfC3VYvbw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/data.0~p2cN7biB2xoXya2OTV3Ofi70Ak3kG6BxVhYie74-SeZWgBPtx5bkOsIdKzjRA6w2C4U5Hk9uSVIsMDfC3VYvbw== new file mode 100644 index 0000000000000000000000000000000000000000..6617bec881a9b4fbd32e822f0fe08054c4e24771 GIT binary patch literal 296 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 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~3F5E5jYaMNKsZ-KJkadRaYSBZ0UUeGojsdRdAhtYOlx2Y4uQwt8Wsic-RD8B4aQrJeF9XAC8H_KZWdfARqPTQQ== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~3F5E5jYaMNKsZ-KJkadRaYSBZ0UUeGojsdRdAhtYOlx2Y4uQwt8Wsic-RD8B4aQrJeF9XAC8H_KZWdfARqPTQQ== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~3eYFsAo25EFcn0rWHiD78lTFFszU1FGXwWP_RWtMD7GtffyNyRmf1kgX7KyyhS_oWl4SqJM42_yEpawqEdyF0g== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~3eYFsAo25EFcn0rWHiD78lTFFszU1FGXwWP_RWtMD7GtffyNyRmf1kgX7KyyhS_oWl4SqJM42_yEpawqEdyF0g== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~AdVSW07moLLeZxhjBH-lUUN3BlLoWFgS_wITNFih4G4NEGrxit06S8o5f0e6rUUUbDuJyokwMWiMaANyMOod0Q== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~AdVSW07moLLeZxhjBH-lUUN3BlLoWFgS_wITNFih4G4NEGrxit06S8o5f0e6rUUUbDuJyokwMWiMaANyMOod0Q== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~CxhRYBgtP6_1O2GJ7RIjnxi7Q_uyrlR6jA3ao4nyw8HwJPKQ1_HxwJUWfsitly0rdG-gTfELKENzOry5SohTzQ== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~CxhRYBgtP6_1O2GJ7RIjnxi7Q_uyrlR6jA3ao4nyw8HwJPKQ1_HxwJUWfsitly0rdG-gTfELKENzOry5SohTzQ== new file mode 100644 index 0000000000000000000000000000000000000000..e70fab5b76434b8d6fc7a346c8a788d02740a0b6 GIT binary patch literal 133 zcmV;00DAudK>&Y$?IJp}>c5)XJ8|XC88aEwyB0A(!~;^fuO`>-06f$Ml=JJ0w3zfP zoHUieWy-sB3?0}^&`ns;cEz?`SjIsB-R1?b3O3|HT%StT9w7VjRK*s|)YMUz!DIhL nYfKNZt$qBB$r+#4NEhs^vV||`T3!;UlQ`S_gr%%15!{8+Oh!Z( literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~KSvv5tGtjZy6o-IRDaq84UbD1KvawMyPlQ8eQnnY_FpfsA1HJIryb5Zr-58n7oxcHywwWs_Q1ZSBaRl2Uzc0HA== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~KSvv5tGtjZy6o-IRDaq84UbD1KvawMyPlQ8eQnnY_FpfsA1HJIryb5Zr-58n7oxcHywwWs_Q1ZSBaRl2Uzc0HA== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~KVul-ltKGyDfurvaNjrPpUo-z2B0A0bhQk8DJ5H6izXqDQraO8Es7ZycQCyz_MPySALBJ8JKL3BTVRTuxf2DYw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~KVul-ltKGyDfurvaNjrPpUo-z2B0A0bhQk8DJ5H6izXqDQraO8Es7ZycQCyz_MPySALBJ8JKL3BTVRTuxf2DYw== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~L6kj3LHpqW0S9TKONTMK5txXi4VMq3w8G7bkk73sBQtopPqBhCgohNIsPBQyi6kTESTYftQ3iulttZwcr1oCWw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~L6kj3LHpqW0S9TKONTMK5txXi4VMq3w8G7bkk73sBQtopPqBhCgohNIsPBQyi6kTESTYftQ3iulttZwcr1oCWw== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~LxGkkMbqa-WkFMly9asxsPSDYF-5urdabgN7D6jfJYCLfxLZejdKMdQKY9eSMImsfDPoJM7OH0AbjBtHzMNW4g== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~LxGkkMbqa-WkFMly9asxsPSDYF-5urdabgN7D6jfJYCLfxLZejdKMdQKY9eSMImsfDPoJM7OH0AbjBtHzMNW4g== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~P2grdcnPz5mOTlpXCdHgYEBsm2I4gI-fb0dlSsg6sZ0Yyk4NsxNa3kPrsD_iUEUUub9Alc5-Hp_YEhDHMqYK3g== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~P2grdcnPz5mOTlpXCdHgYEBsm2I4gI-fb0dlSsg6sZ0Yyk4NsxNa3kPrsD_iUEUUub9Alc5-Hp_YEhDHMqYK3g== new file mode 100644 index 0000000000000000000000000000000000000000..d32b0fd69474825a137545db496278bb04ef8b63 GIT binary patch literal 67 zcmV-J0KESJK>(EE96`kf_z?VgtPE|tioxHV*PfY0vxSPizJYns&u!#tTbGDV(KE>r Zh0G8CWV#oRjYm}lGAjJeo%1FY$S;70A;|y$ literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~Pn26D8iv4bIuBiz78MwEzDqZqiCA0tiktXOQACFIOlpNZl3jmseM8uSbJSkGoGivQQ5tIJZKgRHJ2ducmD20WQ== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~Pn26D8iv4bIuBiz78MwEzDqZqiCA0tiktXOQACFIOlpNZl3jmseM8uSbJSkGoGivQQ5tIJZKgRHJ2ducmD20WQ== new file mode 100644 index 0000000000000000000000000000000000000000..7f974165f9d1a71afd055af8213d4ea05e7cba66 GIT binary patch literal 199 zcmV;&066~xK>#nQBiym+scjPVGLAJf3g+Bbi-k<9d^{VrW?dN)cj)CyzQk}!#^d^6}I&dwh|8;l!A%)?gVK>(o>BGSgtE=ykwFvd|Y zlBg1?bU1_PaI>{h68$J&8odft#soHkD(^37Q6SbYkbggDBzDz?@R2MeyiaY_j$}j@ BS;_za literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~U-9R3FQRBx3QsSxpqonM-pvERFzaJW1bYbwIRS1o-bg2CnrSurrfyEcFleWzBqicNDNL49or87B4bOeA-5Ag9g== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~U-9R3FQRBx3QsSxpqonM-pvERFzaJW1bYbwIRS1o-bg2CnrSurrfyEcFleWzBqicNDNL49or87B4bOeA-5Ag9g== new file mode 100644 index 0000000000000000000000000000000000000000..45be64ff6ab1e5dd0ba25efbf524a710261edd3a GIT binary patch literal 199 zcmV;&066~xK>&ZzW{K7&J@*9+UBuoT>JG8NaFP-C3N)h#+ZG0~PdiQ~Tp9K>$B!D|N}w&zX)+T2~3t z;9x*(n_@VCkDqTxWlG38v7H#oP7SjYTHZtJus`BZMHIQeK$XsZ9-r6}5XUm63f{oV BUE2Tv literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~UK44KxJ2pfLaI9w_lriGonbG9xGLUP9WXBMmii_L25McXJi6cknbSBZ6_AbaEXxet1mYJdonkdHLr2eeSByQbg== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~UK44KxJ2pfLaI9w_lriGonbG9xGLUP9WXBMmii_L25McXJi6cknbSBZ6_AbaEXxet1mYJdonkdHLr2eeSByQbg== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~aQbaOGEFCjnYF-N0FSHhIVBNcGp8DDGJSWc5K_mmeyBupSl2AE_UK2rWXUCaUJ1V5pe0j4WRGIdSNpcO8s3PAA== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~aQbaOGEFCjnYF-N0FSHhIVBNcGp8DDGJSWc5K_mmeyBupSl2AE_UK2rWXUCaUJ1V5pe0j4WRGIdSNpcO8s3PAA== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~bwxBNsVr6SQCABg0yK_RRGiChrFqh24mJjYprxgKT04u2OL4CPJ4fcFTHEgv4VwiykX8NN2Ee7q-0K1iykoEIA== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~bwxBNsVr6SQCABg0yK_RRGiChrFqh24mJjYprxgKT04u2OL4CPJ4fcFTHEgv4VwiykX8NN2Ee7q-0K1iykoEIA== new file mode 100644 index 0000000000000000000000000000000000000000..5ed4178dc69ad0135c0cd5afb81199e124c89be2 GIT binary patch literal 463 zcmV;=0WkgtK>*V(6$!f46j?m}J$JX^B4OP=Jr%i$8|x(~>&;j%6UEc@`x z1k5^_svv;U*rc^{kN_b_I$BL;UE`X^jPm50B`F4=Xsl@`;Z{^K>$#$I4cr%rSjS%+&`AMhN5=H_YsRw|5jWRCW)j3`wschze$4) z+!B=zRA4CetrTzR6~nN>CXf01bEV22p=^>(baV+yvXj}Kb7kH);vf%eQ?>y4-QNYN FI=&fE*9`yw literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~f3_tIjqz6r-a2ztx5c4ZMxnUuxYxQMQDUrmvJtfuADzUBZTz64u0mPQsnDSVwWXKu3QMHdhM0E1Y0XbFtl1Yxg== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~f3_tIjqz6r-a2ztx5c4ZMxnUuxYxQMQDUrmvJtfuADzUBZTz64u0mPQsnDSVwWXKu3QMHdhM0E1Y0XbFtl1Yxg== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~f9FmidYmPfcFDOS1qsPzagnzWDP6LEeRMM3GFM11D0wHoawL_EwhqN-wuAHAGWXAzaLMXSLlmpyoI8x0LgBzKw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~f9FmidYmPfcFDOS1qsPzagnzWDP6LEeRMM3GFM11D0wHoawL_EwhqN-wuAHAGWXAzaLMXSLlmpyoI8x0LgBzKw== new file mode 100644 index 0000000000000000000000000000000000000000..695a89f58aa65b0f475b8d1ed9b51494b0ba56bd GIT binary patch literal 133 zcmV;00DAudK>!OFQD7J?Kd<#WVTtV$BcB+%L;JF>RCks#`yExPBvAq{Z nDYj!6rY$6V=3orPb~#rVDvkg`R~w4aGb{tzhw+USSoWz+Xmvhz literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~i0dWvxL7HlPk9DlQyox1oB0C5SIPrnTHY1o8vpQOxBInw6meQVBJQEwlGwHKBjacbYdI0eARgsG87FsTZFabGw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~i0dWvxL7HlPk9DlQyox1oB0C5SIPrnTHY1o8vpQOxBInw6meQVBJQEwlGwHKBjacbYdI0eARgsG87FsTZFabGw== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~lOIcQcUG-BD8eawMbbuKwd-d156ZRbOFir2-gXnRz23kaluXiE7RM8kRhcwP_2S6F4-NR1UFMir8zp3zJhXILw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~lOIcQcUG-BD8eawMbbuKwd-d156ZRbOFir2-gXnRz23kaluXiE7RM8kRhcwP_2S6F4-NR1UFMir8zp3zJhXILw== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~p2cN7biB2xoXya2OTV3Ofi70Ak3kG6BxVhYie74-SeZWgBPtx5bkOsIdKzjRA6w2C4U5Hk9uSVIsMDfC3VYvbw== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~p2cN7biB2xoXya2OTV3Ofi70Ak3kG6BxVhYie74-SeZWgBPtx5bkOsIdKzjRA6w2C4U5Hk9uSVIsMDfC3VYvbw== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~s70XznCIqqMyq3h0pkzAOusP97K7ONPtsb0XRym2YximLSR85mAMxXY5VxgqjgBCVxuK0TMsA9qH8Y0VWPapTQ== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~s70XznCIqqMyq3h0pkzAOusP97K7ONPtsb0XRym2YximLSR85mAMxXY5VxgqjgBCVxuK0TMsA9qH8Y0VWPapTQ== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~sOOBhiUwRYKp-TuVTYDV0JkgYU98sP79yTw3tMIfWPbhMjqL59vkSmzZ5MCa_n5u5gAQoHFPm9PNgFzdjpVepg== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~sOOBhiUwRYKp-TuVTYDV0JkgYU98sP79yTw3tMIfWPbhMjqL59vkSmzZ5MCa_n5u5gAQoHFPm9PNgFzdjpVepg== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~u1v7DvnRv0mDDdwSlQ5UYCj1rRRv6RXDsMEmj_n7c6XKHqFskk10dAlKspPZnnNl3jfiIA9rU7YA-d3fBak6vg== b/trainer/spec/fixtures/SwiftTesting.xcresult/Data/refs.0~u1v7DvnRv0mDDdwSlQ5UYCj1rRRv6RXDsMEmj_n7c6XKHqFskk10dAlKspPZnnNl3jfiIA9rU7YA-d3fBak6vg== new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/Info.plist b/trainer/spec/fixtures/SwiftTesting.xcresult/Info.plist new file mode 100644 index 00000000000..2335d840ca3 --- /dev/null +++ b/trainer/spec/fixtures/SwiftTesting.xcresult/Info.plist @@ -0,0 +1,29 @@ + + + + + dateCreated + 2025-03-01T00:58:58Z + externalLocations + + rootId + + hash + 0~bwxBNsVr6SQCABg0yK_RRGiChrFqh24mJjYprxgKT04u2OL4CPJ4fcFTHEgv4VwiykX8NN2Ee7q-0K1iykoEIA== + + storage + + backend + fileBacked2 + compression + standard + + version + + major + 3 + minor + 53 + + + diff --git a/trainer/spec/fixtures/SwiftTesting.xcresult/database.sqlite3 b/trainer/spec/fixtures/SwiftTesting.xcresult/database.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..48e91f731e52c75d6725b7fcda2157270779e4dc GIT binary patch literal 245760 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 literal 0 HcmV?d00001 diff --git a/trainer/spec/junit_generator_spec.rb b/trainer/spec/junit_generator_spec.rb index 8ae0d39d99e..f7a154bb795 100644 --- a/trainer/spec/junit_generator_spec.rb +++ b/trainer/spec/junit_generator_spec.rb @@ -1,32 +1,38 @@ describe Trainer do describe Trainer::JunitGenerator do - it "works for a valid .plist file" do - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist") - junit = File.read("./trainer/spec/fixtures/Valid1.junit") - expect(tp.to_junit).to eq(junit) - end + # it "works for a valid .plist file" do + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist") + # junit = File.read("./trainer/spec/fixtures/Valid1.junit") + # expect(tp.to_junit).to eq(junit) + # end - it "works for a valid .plist file and xcpretty naming" do - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist", { xcpretty_naming: true }) - junit = File.read("./trainer/spec/fixtures/Valid1-x.junit") - expect(tp.to_junit).to eq(junit) - end + # it "works for a valid .plist file and xcpretty naming" do + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist", { xcpretty_naming: true }) + # junit = File.read("./trainer/spec/fixtures/Valid1-x.junit") + # expect(tp.to_junit).to eq(junit) + # end - it "works for a with all tests passing" do - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid2.plist") - junit = File.read("./trainer/spec/fixtures/Valid2.junit") - expect(tp.to_junit).to eq(junit) - end + # it "works for a with all tests passing" do + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid2.plist") + # junit = File.read("./trainer/spec/fixtures/Valid2.junit") + # expect(tp.to_junit).to eq(junit) + # end - it "works for a with all tests passing and xcpretty naming" do - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid2.plist", { xcpretty_naming: true }) - junit = File.read("./trainer/spec/fixtures/Valid2-x.junit") - expect(tp.to_junit).to eq(junit) - end + # it "works for a with all tests passing and xcpretty naming" do + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid2.plist", { xcpretty_naming: true }) + # junit = File.read("./trainer/spec/fixtures/Valid2-x.junit") + # expect(tp.to_junit).to eq(junit) + # end + + # it "works with an xcresult", requires_xcode: true do + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Test.test_result.xcresult") + # junit = File.read("./trainer/spec/fixtures/XCResult.junit") + # expect(tp.to_junit).to eq(junit) + # end - it "works with an xcresult", requires_xcode: true do - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Test.test_result.xcresult") - junit = File.read("./trainer/spec/fixtures/XCResult.junit") + it "works with an xcresult from Swfit Testing", requires_xcode: true do + tp = Trainer::TestParser.new("./trainer/spec/fixtures/SwiftTesting.xcresult") + junit = File.read("./trainer/spec/fixtures/SwiftTesting.junit") expect(tp.to_junit).to eq(junit) end end diff --git a/trainer/spec/test_parser_spec.rb b/trainer/spec/test_parser_spec.rb index e1b9e2f3810..0e51e28f5b0 100644 --- a/trainer/spec/test_parser_spec.rb +++ b/trainer/spec/test_parser_spec.rb @@ -1,279 +1,385 @@ describe Trainer do describe Trainer::TestParser do - describe "Loading a file" do - it "raises an error if the file doesn't exist" do - expect do - Trainer::TestParser.new("notExistent") - end.to raise_error(/File not found at path/) - end + # describe "Loading a file" do + # it "raises an error if the file doesn't exist" do + # expect do + # Trainer::TestParser.new("notExistent") + # end.to raise_error(/File not found at path/) + # end - it "raises an error if FormatVersion is not supported" do - expect do - Trainer::TestParser.new("./trainer/spec/fixtures/InvalidVersionMismatch.plist") - end.to raise_error("Format version '0.9' is not supported, must be 1.1, 1.2") - end + # it "raises an error if FormatVersion is not supported" do + # expect do + # Trainer::TestParser.new("./trainer/spec/fixtures/InvalidVersionMismatch.plist") + # end.to raise_error("Format version '0.9' is not supported, must be 1.1, 1.2") + # end - it "loads a file without throwing an error" do - Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist") - end - end + # it "loads a file without throwing an error" do + # Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist") + # end + # end - describe "#auto_convert" do - it "raises an error if no files were found" do - expect do - Trainer::TestParser.auto_convert({ path: "bin" }) - end.to raise_error("No test result files found in directory 'bin', make sure the file name ends with 'TestSummaries.plist' or '.xcresult'") - end - end + # describe "#auto_convert" do + # it "raises an error if no files were found" do + # expect do + # Trainer::TestParser.auto_convert({ path: "bin" }) + # end.to raise_error("No test result files found in directory 'bin', make sure the file name ends with 'TestSummaries.plist' or '.xcresult'") + # end + # end - describe "#generate_cmd_parse_xcresult" do - let(:xcresult_sample_path) { "./trainer/spec/fixtures/Test.test_result.xcresult" } - let!(:subject) { Trainer::TestParser.new(xcresult_sample_path) } - let(:command) { subject.send(:generate_cmd_parse_xcresult, xcresult_sample_path) } + # describe "#generate_cmd_parse_xcresult" do + # let(:xcresult_sample_path) { "./trainer/spec/fixtures/Test.test_result.xcresult" } + # let!(:subject) { Trainer::TestParser.new(xcresult_sample_path) } + # let(:command) { subject.send(:generate_cmd_parse_xcresult, xcresult_sample_path) } - before do - allow(File).to receive(:expand_path).with(xcresult_sample_path).and_return(xcresult_sample_path) - allow_any_instance_of(Trainer::TestParser).to receive(:`).with('xcrun xcresulttool version').and_return(version) - end + # before do + # allow(File).to receive(:expand_path).with(xcresult_sample_path).and_return(xcresult_sample_path) + # allow_any_instance_of(Trainer::TestParser).to receive(:`).with('xcrun xcresulttool version').and_return(version) + # end - context 'with >= Xcode 16 beta 3' do - let(:version) { 'xcresulttool version 23021, format version 3.53 (current)' } - let(:expected) { "xcrun xcresulttool get --format json --path #{xcresult_sample_path} --legacy" } + # context 'with >= Xcode 16 beta 3' do + # let(:version) { 'xcresulttool version 23021, format version 3.53 (current)' } + # let(:expected) { "xcrun xcresulttool get --format json --path #{xcresult_sample_path} --legacy" } - it 'should pass `--legacy`', requires_xcode: true do - expect(command).to eq(expected) - end - end + # it 'should pass `--legacy`', requires_xcode: true do + # expect(command).to eq(expected) + # end + # end - context 'with < Xcode 16 beta 3' do - let(:version) { 'xcresulttool version 22608.2, format version 3.49 (current)' } - let(:expected) { "xcrun xcresulttool get --format json --path #{xcresult_sample_path}" } + # context 'with < Xcode 16 beta 3' do + # let(:version) { 'xcresulttool version 22608.2, format version 3.49 (current)' } + # let(:expected) { "xcrun xcresulttool get --format json --path #{xcresult_sample_path}" } - it 'should not pass `--legacy`', requires_xcode: true do - expect(command).to eq(expected) - end - end - end + # it 'should not pass `--legacy`', requires_xcode: true do + # expect(command).to eq(expected) + # end + # end + # end describe "Stores the data in a useful format" do - describe "#tests_successful?" do - it "returns false if tests failed" do - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist") - expect(tp.tests_successful?).to eq(false) - end - end + # describe "#tests_successful?" do + # it "returns false if tests failed" do + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist") + # expect(tp.tests_successful?).to eq(false) + # end + # end - it "works as expected with plist" do - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist") - expect(tp.data).to eq([ - { - project_path: "Trainer.xcodeproj", - target_name: "Unit", - test_name: "Unit", - duration: 0.4, - tests: [ - { - identifier: "Unit/testExample()", - test_group: "Unit", - name: "testExample()", - object_class: "IDESchemeActionTestSummary", - status: "Success", - guid: "6840EEB8-3D7A-4B2D-9A45-6955DC11D32B", - duration: 0.1 - }, - { - identifier: "Unit/testExample2()", - test_group: "Unit", - name: "testExample2()", - object_class: "IDESchemeActionTestSummary", - status: "Failure", - guid: "B2EB311E-ED8D-4DAD-8AF0-A455A20855DF", - duration: 0.1, - failures: [ - { - file_name: "/Users/liamnichols/Code/Local/Trainer/Unit/Unit.swift", - line_number: 19, - message: "XCTAssertTrue failed - ", - performance_failure: false, - failure_message: "XCTAssertTrue failed - (/Users/liamnichols/Code/Local/Trainer/Unit/Unit.swift:19)" - } - ] - }, - { - identifier: "Unit/testPerformanceExample()", - test_group: "Unit", - name: "testPerformanceExample()", - object_class: "IDESchemeActionTestSummary", - status: "Success", - guid: "72D0B210-939D-4751-966F-986B6CB2660C", - duration: 0.2 - } - ], - number_of_tests: 3, - number_of_failures: 1, - number_of_tests_excluding_retries: 3, - number_of_failures_excluding_retries: 1, - number_of_retries: 0 - } - ]) - end + # it "works as expected with plist" do + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Valid1.plist") + # expect(tp.data).to eq([ + # { + # project_path: "Trainer.xcodeproj", + # target_name: "Unit", + # test_name: "Unit", + # duration: 0.4, + # tests: [ + # { + # identifier: "Unit/testExample()", + # test_group: "Unit", + # name: "testExample()", + # object_class: "IDESchemeActionTestSummary", + # status: "Success", + # guid: "6840EEB8-3D7A-4B2D-9A45-6955DC11D32B", + # duration: 0.1 + # }, + # { + # identifier: "Unit/testExample2()", + # test_group: "Unit", + # name: "testExample2()", + # object_class: "IDESchemeActionTestSummary", + # status: "Failure", + # guid: "B2EB311E-ED8D-4DAD-8AF0-A455A20855DF", + # duration: 0.1, + # failures: [ + # { + # file_name: "/Users/liamnichols/Code/Local/Trainer/Unit/Unit.swift", + # line_number: 19, + # message: "XCTAssertTrue failed - ", + # performance_failure: false, + # failure_message: "XCTAssertTrue failed - (/Users/liamnichols/Code/Local/Trainer/Unit/Unit.swift:19)" + # } + # ] + # }, + # { + # identifier: "Unit/testPerformanceExample()", + # test_group: "Unit", + # name: "testPerformanceExample()", + # object_class: "IDESchemeActionTestSummary", + # status: "Success", + # guid: "72D0B210-939D-4751-966F-986B6CB2660C", + # duration: 0.2 + # } + # ], + # number_of_tests: 3, + # number_of_failures: 1, + # number_of_tests_excluding_retries: 3, + # number_of_failures_excluding_retries: 1, + # number_of_retries: 0 + # } + # ]) + # end - it "works as expected with xcresult", requires_xcode: true do - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Test.test_result.xcresult") + it "works as expected with an xcresult from Swift Testing without parameterized tests", requires_xcode: true do + tp = Trainer::TestParser.new("./trainer/spec/fixtures/SwiftTesting.xcresult") expect(tp.data).to eq([ - { - project_path: "Test.xcodeproj", - target_name: "TestUITests", - test_name: "TestUITests", - configuration_name: "Test Scheme Action", - duration: 16.05245804786682, - tests: [ - { - identifier: "TestUITests.testExample()", - name: "testExample()", - duration: 16.05245804786682, - status: "Success", - test_group: "TestUITests", - guid: "" - } - ], - number_of_tests: 1, - number_of_failures: 0, - number_of_skipped: 0, - number_of_tests_excluding_retries: 1, - number_of_failures_excluding_retries: 0, - number_of_retries: 0 - }, - { - project_path: "Test.xcodeproj", - target_name: "TestThisDude", - test_name: "TestThisDude", - configuration_name: "Test Scheme Action", - duration: 0.5279300212860107, - tests: [ - { - identifier: "TestTests.testExample()", - name: "testExample()", - duration: 0.0005381107330322266, - status: "Success", - test_group: "TestTests", - guid: "" - }, - { - identifier: "TestTests.testFailureJosh1()", - name: "testFailureJosh1()", - duration: 0.006072044372558594, - status: "Failure", - test_group: "TestTests", - guid: "", - failures: [ - { - file_name: "", - line_number: 0, - message: "", - performance_failure: {}, - failure_message: "XCTAssertTrue failed (/Users/josh/Projects/fastlane/test-ios/TestTests/TestTests.swift#CharacterRangeLen=0&EndingLineNumber=36&StartingLineNumber=36)" - } - ] - }, - { - identifier: "TestTests.testPerformanceExample()", - name: "testPerformanceExample()", - duration: 0.2661939859390259, - status: "Success", - test_group: "TestTests", - guid: "" - }, - { - identifier: "TestThisDude.testExample()", - name: "testExample()", - duration: 0.0004099607467651367, - status: "Success", - test_group: "TestThisDude", - guid: "" - }, - { - identifier: "TestThisDude.testFailureJosh2()", - name: "testFailureJosh2()", - duration: 0.001544952392578125, - status: "Failure", - test_group: "TestThisDude", - guid: "", - failures: [ - { - file_name: "", - line_number: 0, - message: "", - performance_failure: {}, - failure_message: "XCTAssertTrue failed (/Users/josh/Projects/fastlane/test-ios/TestThisDude/TestThisDude.swift#CharacterRangeLen=0&EndingLineNumber=35&StartingLineNumber=35)" - } - ] - }, - { - identifier: "TestThisDude.testPerformanceExample()", - name: "testPerformanceExample()", - duration: 0.2531709671020508, - status: "Success", - test_group: "TestThisDude", - guid: "" - } - ], - number_of_tests: 6, - number_of_failures: 2, - number_of_skipped: 0, - number_of_tests_excluding_retries: 6, - number_of_failures_excluding_retries: 2, - number_of_retries: 0 - } - ]) + { + "project_path": "FastlaneTrainerSwiftTesting.xcodeproj", + "target_name": "FastlaneTrainerSwiftTestingTests", + "test_name": "FastlaneTrainerSwiftTestingTests", + "configuration_name": "Configuration 1", + "duration": 0.0024025440216064453, + "tests": [ + { + "identifier": "NestedTests.nestedExampleShouldFail()", + "name": "nestedExampleShouldFail()", + "duration": 0.001239776611328125, + "status": "Failure", + "test_group": "NestedTests", + "guid": "", + "failures": [ + { + "file_name": "", + "line_number": 0, + "message": "", + "performance_failure": { + }, + "failure_message": "Expectation failed: true == false (/Users/jhagglund/dev2/FastlaneTrainerSwiftTesting/FastlaneTrainerSwiftTestingTests/FastlaneTrainerSwiftTestingTests.swift#EndingLineNumber=18&StartingLineNumber=18)" + } + ] + }, + { + "identifier": "NestedTests.nestedExampleShouldFail()", + "name": "nestedExampleShouldFail()", + "duration": 0.0004439353942871094, + "status": "Failure", + "test_group": "NestedTests", + "guid": "", + "failures": [ + { + "file_name": "", + "line_number": 0, + "message": "", + "performance_failure": { + }, + "failure_message": "Expectation failed: true == false (/Users/jhagglund/dev2/FastlaneTrainerSwiftTesting/FastlaneTrainerSwiftTestingTests/FastlaneTrainerSwiftTestingTests.swift#EndingLineNumber=18&StartingLineNumber=18)" + } + ] + }, + { + "identifier": "NestedTests.nestedExampleShouldFail()", + "name": "nestedExampleShouldFail()", + "duration": 9.012222290039062e-05, + "status": "Failure", + "test_group": "NestedTests", + "guid": "", + "failures": [ + { + "file_name": "", + "line_number": 0, + "message": "", + "performance_failure": { + }, + "failure_message": "Expectation failed: true == false (/Users/jhagglund/dev2/FastlaneTrainerSwiftTesting/FastlaneTrainerSwiftTestingTests/FastlaneTrainerSwiftTestingTests.swift#EndingLineNumber=18&StartingLineNumber=18)" + } + ] + }, + { + "identifier": "FastlaneTrainerSwiftTestingTests.topLevelShouldPass()", + "name": "topLevelShouldPass()", + "duration": 0.00015282630920410156, + "status": "Success", + "test_group": "FastlaneTrainerSwiftTestingTests", + "guid": "" + }, + { + "identifier": "FastlaneTrainerSwiftTestingTests.topLevelShouldPass()", + "name": "topLevelShouldPass()", + "duration": 0.0004169940948486328, + "status": "Success", + "test_group": "FastlaneTrainerSwiftTestingTests", + "guid": "" + }, + { + "identifier": "FastlaneTrainerSwiftTestingTests.topLevelShouldPass()", + "name": "topLevelShouldPass()", + "duration": 5.888938903808594e-05, + "status": "Success", + "test_group": "FastlaneTrainerSwiftTestingTests", + "guid": "" + } + ], + "number_of_tests": 6, + "number_of_failures": 3, + "number_of_tests_excluding_retries": 2, + "number_of_skipped": 0, + "number_of_failures_excluding_retries": 1, + "number_of_retries": 4 + } + ]) + # File.write("./tmp/SwiftTesting-trainer-data.json", JSON.pretty_generate(tp.data)) + # puts tp.data + # puts tp.number_of_tests + # puts tp.number_of_tests_excluding_retries + # puts tp.number_of_failures + # puts tp.number_of_failures_excluding_retries + # expect(tp.number_of_failures_excluding_retries).to eq(1) end - it "still produces a test failure message when file url is missing", requires_xcode: true do - allow_any_instance_of(Trainer::XCResult::TestFailureIssueSummary).to receive(:document_location_in_creating_workspace).and_return(nil) - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Test.test_result.xcresult") - test_failures = tp.data.last[:tests].select { |t| t[:failures] } - failure_messages = test_failures.map { |tf| tf[:failures].first[:failure_message] } - expect(failure_messages).to eq(["XCTAssertTrue failed", "XCTAssertTrue failed"]) - RSpec::Mocks.space.proxy_for(Trainer::XCResult::TestFailureIssueSummary).reset - end + # it "works as expected with xcresult", requires_xcode: true do + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Test.test_result.xcresult") + # expect(tp.data).to eq([ + # { + # project_path: "Test.xcodeproj", + # target_name: "TestUITests", + # test_name: "TestUITests", + # configuration_name: "Test Scheme Action", + # duration: 16.05245804786682, + # tests: [ + # { + # identifier: "TestUITests.testExample()", + # name: "testExample()", + # duration: 16.05245804786682, + # status: "Success", + # test_group: "TestUITests", + # guid: "" + # } + # ], + # number_of_tests: 1, + # number_of_failures: 0, + # number_of_skipped: 0, + # number_of_tests_excluding_retries: 1, + # number_of_failures_excluding_retries: 0, + # number_of_retries: 0 + # }, + # { + # project_path: "Test.xcodeproj", + # target_name: "TestThisDude", + # test_name: "TestThisDude", + # configuration_name: "Test Scheme Action", + # duration: 0.5279300212860107, + # tests: [ + # { + # identifier: "TestTests.testExample()", + # name: "testExample()", + # duration: 0.0005381107330322266, + # status: "Success", + # test_group: "TestTests", + # guid: "" + # }, + # { + # identifier: "TestTests.testFailureJosh1()", + # name: "testFailureJosh1()", + # duration: 0.006072044372558594, + # status: "Failure", + # test_group: "TestTests", + # guid: "", + # failures: [ + # { + # file_name: "", + # line_number: 0, + # message: "", + # performance_failure: {}, + # failure_message: "XCTAssertTrue failed (/Users/josh/Projects/fastlane/test-ios/TestTests/TestTests.swift#CharacterRangeLen=0&EndingLineNumber=36&StartingLineNumber=36)" + # } + # ] + # }, + # { + # identifier: "TestTests.testPerformanceExample()", + # name: "testPerformanceExample()", + # duration: 0.2661939859390259, + # status: "Success", + # test_group: "TestTests", + # guid: "" + # }, + # { + # identifier: "TestThisDude.testExample()", + # name: "testExample()", + # duration: 0.0004099607467651367, + # status: "Success", + # test_group: "TestThisDude", + # guid: "" + # }, + # { + # identifier: "TestThisDude.testFailureJosh2()", + # name: "testFailureJosh2()", + # duration: 0.001544952392578125, + # status: "Failure", + # test_group: "TestThisDude", + # guid: "", + # failures: [ + # { + # file_name: "", + # line_number: 0, + # message: "", + # performance_failure: {}, + # failure_message: "XCTAssertTrue failed (/Users/josh/Projects/fastlane/test-ios/TestThisDude/TestThisDude.swift#CharacterRangeLen=0&EndingLineNumber=35&StartingLineNumber=35)" + # } + # ] + # }, + # { + # identifier: "TestThisDude.testPerformanceExample()", + # name: "testPerformanceExample()", + # duration: 0.2531709671020508, + # status: "Success", + # test_group: "TestThisDude", + # guid: "" + # } + # ], + # number_of_tests: 6, + # number_of_failures: 2, + # number_of_skipped: 0, + # number_of_tests_excluding_retries: 6, + # number_of_failures_excluding_retries: 2, + # number_of_retries: 0 + # } + # ]) + # end - it "works as expected with xcresult with spaces", requires_xcode: true do - tp = Trainer::TestParser.new("./trainer/spec/fixtures/Test.with_spaces.xcresult") - expect(tp.data).to eq([ - { - project_path: "SpaceTests.xcodeproj", - target_name: "SpaceTestsTests", - test_name: "SpaceTestsTests", - configuration_name: "Test Scheme Action", - duration: 0.21180307865142822, - tests: [ - { - identifier: "SpaceTestsSpec.a test with spaces, should always fail()", - name: "a test with spaces, should always fail()", - duration: 0.21180307865142822, - status: "Failure", - test_group: "SpaceTestsSpec", - guid: "", - failures: [ - { - failure_message: "expected to equal <1>, got <2>\n (/Users/mahmood.tahir/Developer/SpaceTests/SpaceTestsTests/TestSpec.swift#CharacterRangeLen=0&EndingLineNumber=15&StartingLineNumber=15)", - file_name: "", - line_number: 0, - message: "", - performance_failure: {} - } - ] - } - ], - number_of_tests: 1, - number_of_failures: 1, - number_of_skipped: 0, - number_of_tests_excluding_retries: 1, - number_of_failures_excluding_retries: 1, - number_of_retries: 0 - } - ]) - end + # it "still produces a test failure message when file url is missing", requires_xcode: true do + # allow_any_instance_of(Trainer::XCResult::TestFailureIssueSummary).to receive(:document_location_in_creating_workspace).and_return(nil) + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Test.test_result.xcresult") + # test_failures = tp.data.last[:tests].select { |t| t[:failures] } + # failure_messages = test_failures.map { |tf| tf[:failures].first[:failure_message] } + # expect(failure_messages).to eq(["XCTAssertTrue failed", "XCTAssertTrue failed"]) + # RSpec::Mocks.space.proxy_for(Trainer::XCResult::TestFailureIssueSummary).reset + # end + + # it "works as expected with xcresult with spaces", requires_xcode: true do + # tp = Trainer::TestParser.new("./trainer/spec/fixtures/Test.with_spaces.xcresult") + # expect(tp.data).to eq([ + # { + # project_path: "SpaceTests.xcodeproj", + # target_name: "SpaceTestsTests", + # test_name: "SpaceTestsTests", + # configuration_name: "Test Scheme Action", + # duration: 0.21180307865142822, + # tests: [ + # { + # identifier: "SpaceTestsSpec.a test with spaces, should always fail()", + # name: "a test with spaces, should always fail()", + # duration: 0.21180307865142822, + # status: "Failure", + # test_group: "SpaceTestsSpec", + # guid: "", + # failures: [ + # { + # failure_message: "expected to equal <1>, got <2>\n (/Users/mahmood.tahir/Developer/SpaceTests/SpaceTestsTests/TestSpec.swift#CharacterRangeLen=0&EndingLineNumber=15&StartingLineNumber=15)", + # file_name: "", + # line_number: 0, + # message: "", + # performance_failure: {} + # } + # ] + # } + # ], + # number_of_tests: 1, + # number_of_failures: 1, + # number_of_skipped: 0, + # number_of_tests_excluding_retries: 1, + # number_of_failures_excluding_retries: 1, + # number_of_retries: 0 + # } + # ]) + # end end end end