// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Expected event output when running the tests in sample_tests.cc with the default options.
// This file should be imported using `include!("<path to file>")`.
{
    use {
        maplit::hashmap,
        test_executor::{TestEvent, TestResult},
    };

    hashmap! {
        Some("SampleTest1.SimpleFail".to_string()) => vec![
            TestEvent::test_case_started("SampleTest1.SimpleFail"),
            TestEvent::stdout_message(
                "SampleTest1.SimpleFail",
                "../../src/sys/test_runners/gtest/test_data/sample_tests.cc:9: Failure",
            ),
            TestEvent::stdout_message("SampleTest1.SimpleFail", "Value of: true"),
            TestEvent::stdout_message("SampleTest1.SimpleFail", "  Actual: true"),
            TestEvent::stdout_message("SampleTest1.SimpleFail", "Expected: false"),
            TestEvent::test_case_finished("SampleTest1.SimpleFail", TestResult::Failed),
        ],

        Some("SampleTest1.Crashing".to_string()) => vec![
            TestEvent::test_case_started("SampleTest1.Crashing"),
            TestEvent::stdout_message("SampleTest1.Crashing", "Test exited abnormally"),
            TestEvent::test_case_finished("SampleTest1.Crashing", TestResult::Failed),
        ],

        Some("SampleTest2.SimplePass".to_string()) => vec![
            TestEvent::test_case_started("SampleTest2.SimplePass"),
            TestEvent::test_case_finished("SampleTest2.SimplePass", TestResult::Passed),
        ],

        Some("SampleFixture.Test1".to_string()) => vec![
            TestEvent::test_case_started("SampleFixture.Test1"),
            TestEvent::test_case_finished("SampleFixture.Test1", TestResult::Passed),
        ],

        Some("SampleFixture.Test2".to_string()) => vec![
            TestEvent::test_case_started("SampleFixture.Test2"),
            TestEvent::test_case_finished("SampleFixture.Test2", TestResult::Passed),
        ],

        Some("SampleDisabled.DISABLED_TestPass".to_string()) => vec![
            TestEvent::test_case_started("SampleDisabled.DISABLED_TestPass"),
            TestEvent::test_case_finished("SampleDisabled.DISABLED_TestPass", TestResult::Skipped),
        ],

        Some("SampleDisabled.DISABLED_TestFail".to_string()) => vec![
            TestEvent::test_case_started("SampleDisabled.DISABLED_TestFail"),
            TestEvent::test_case_finished("SampleDisabled.DISABLED_TestFail", TestResult::Skipped),
        ],

        Some("SampleDisabled.DynamicSkip".to_string()) => vec![
            TestEvent::test_case_started("SampleDisabled.DynamicSkip"),
            TestEvent::stdout_message(
                "SampleDisabled.DynamicSkip",
                "../../src/sys/test_runners/gtest/test_data/sample_tests.cc:25: Skipped"
            ),
            TestEvent::stdout_message(
                "SampleDisabled.DynamicSkip",
                ""
            ),
            // gtest treats tests that call `GTEST_SKIP()` as `Passed`.
            TestEvent::test_case_finished("SampleDisabled.DynamicSkip", TestResult::Passed),
        ],

        Some("Tests/SampleParameterizedTestFixture.Test/0".to_string()) => vec![
            TestEvent::test_case_started("Tests/SampleParameterizedTestFixture.Test/0"),
            TestEvent::test_case_finished(
                "Tests/SampleParameterizedTestFixture.Test/0",
                TestResult::Passed,
            ),
        ],

        Some("Tests/SampleParameterizedTestFixture.Test/1".to_string()) => vec![
            TestEvent::test_case_started("Tests/SampleParameterizedTestFixture.Test/1"),
            TestEvent::test_case_finished(
                "Tests/SampleParameterizedTestFixture.Test/1",
                TestResult::Passed,
            ),
        ],

        Some("Tests/SampleParameterizedTestFixture.Test/2".to_string()) => vec![
            TestEvent::test_case_started("Tests/SampleParameterizedTestFixture.Test/2"),
            TestEvent::test_case_finished(
                "Tests/SampleParameterizedTestFixture.Test/2",
                TestResult::Passed,
            ),
        ],

        Some("Tests/SampleParameterizedTestFixture.Test/3".to_string()) => vec![
            TestEvent::test_case_started("Tests/SampleParameterizedTestFixture.Test/3"),
            TestEvent::test_case_finished(
                "Tests/SampleParameterizedTestFixture.Test/3",
                TestResult::Passed,
            ),
        ],

        Some("WriteToStdout.TestPass".to_string()) => vec![
            TestEvent::test_case_started("WriteToStdout.TestPass"),
            TestEvent::stdout_message("WriteToStdout.TestPass", "first msg"),
            TestEvent::stdout_message("WriteToStdout.TestPass", "second msg"),
            TestEvent::stdout_message("WriteToStdout.TestPass", ""),
            TestEvent::stdout_message("WriteToStdout.TestPass", ""),
            TestEvent::stdout_message("WriteToStdout.TestPass", "third msg"),
            TestEvent::stdout_message("WriteToStdout.TestPass", ""),
            TestEvent::test_case_finished("WriteToStdout.TestPass", TestResult::Passed),
        ],

        Some("WriteToStdout.TestFail".to_string()) => vec![
            TestEvent::test_case_started("WriteToStdout.TestFail"),
            TestEvent::stdout_message("WriteToStdout.TestFail", "first msg"),
            TestEvent::stdout_message(
                "WriteToStdout.TestFail",
                "../../src/sys/test_runners/gtest/test_data/sample_tests.cc:42: Failure",
            ),
            TestEvent::stdout_message("WriteToStdout.TestFail", "Value of: true"),
            TestEvent::stdout_message("WriteToStdout.TestFail", "  Actual: true"),
            TestEvent::stdout_message("WriteToStdout.TestFail", "Expected: false"),
            TestEvent::stdout_message("WriteToStdout.TestFail", "second msg"),
            TestEvent::test_case_finished("WriteToStdout.TestFail", TestResult::Failed),
        ],

        None => vec![
            TestEvent::test_finished(),
        ],
    }
}
