void BulkScenarioConfigurationSpec::Define()

in Ambit/Source/Ambit/Mode/BulkScenarioConfiguration.spec.cpp [31:350]


void BulkScenarioConfigurationSpec::Define()
{
    Describe("SerializeToJson()", [this]()
    {
        BeforeEach([this]()
        {
            BulkConfig = FBulkScenarioConfiguration{};
        });

        It("Configuration name is the same as the setup", [this]()
        {
            BulkConfig.ConfigurationName = "TestConfigurationName";
            const FString ConfigurationName = BulkConfig.SerializeToJson()->GetStringField(
                JsonConstants::KConfigurationNameKey);
            TestEqual("Configuration Name", ConfigurationName, "TestConfigurationName");
        });

        It("Batch name is the same as the setup", [this]()
        {
            BulkConfig.BatchName = "TestBatchName";
            const FString BatchName = BulkConfig.SerializeToJson()->GetStringField(JsonConstants::KBatchNameKey);
            TestEqual("BatchName", BatchName, "TestBatchName");
        });

        It("Time of day types is the same as the setup", [this]()
        {
            FTimeOfDayTypes TimeOfDay;
            TimeOfDay.SetMorning(true);
            BulkConfig.TimeOfDayTypes = TimeOfDay;
            const bool IsMorning = BulkConfig.SerializeToJson()->GetObjectField(JsonConstants::KTimeOfDayTypesKey)->
                                              GetBoolField(TimeOfDay::KMorning);
            TestTrue("The morning in time of day type is true", IsMorning);
        });

        It("Weather types is the same as the setup", [this]()
        {
            FWeatherTypes WeatherTypes;
            WeatherTypes.SetSunny(true);
            BulkConfig.WeatherTypes = WeatherTypes;
            const bool IsSunny = BulkConfig.SerializeToJson()->GetObjectField(JsonConstants::KWeatherTypesKey)->
                                            GetBoolField(Weather::KSunny);
            TestTrue("Sunny in weather type is true", IsSunny);
        });

        It("Batch pedestrian density is the same as the setup", [this]()
        {
            FPedestrianTraffic PedestrianDensity;
            PedestrianDensity.Min = 0.1f;
            PedestrianDensity.Max = 0.3f;
            BulkConfig.PedestrianDensity = PedestrianDensity;
            const float DensityMin = BulkConfig.SerializeToJson()->GetObjectField(
                JsonConstants::KBatchPedestrianDensityKey)->GetNumberField(JsonConstants::KMinKey);
            const float DensityMax = BulkConfig.SerializeToJson()->GetObjectField(
                JsonConstants::KBatchPedestrianDensityKey)->GetNumberField(JsonConstants::KMaxKey);
            TestEqual("The minimum of pedestrian density", DensityMin, 0.1f);
            TestEqual("The maximum of pedestrian density", DensityMax, 0.3f);
        });

        It("Batch vehicle density is the same as the setup", [this]()
        {
            FVehicleTraffic VehicleDensity;
            VehicleDensity.Min = 0.2f;
            VehicleDensity.Max = 0.4f;
            BulkConfig.VehicleDensity = VehicleDensity;
            const float DensityMin = BulkConfig.SerializeToJson()->GetObjectField(
                JsonConstants::KBatchTrafficDensityKey)->GetNumberField(JsonConstants::KMinKey);
            const float DensityMax = BulkConfig.SerializeToJson()->GetObjectField(
                JsonConstants::KBatchTrafficDensityKey)->GetNumberField(JsonConstants::KMaxKey);
            TestEqual("The minimum of vehicle density", DensityMin, 0.2f);
            TestEqual("The maximum of vehicle density", DensityMax, 0.4f);
        });
    });

    Describe("DeserializeFromJson()", [this]()
    {
        BeforeEach([this]()
        {
            BulkConfig = FBulkScenarioConfiguration{};
            const FString JsonFString = FString(
                "{"
                "   'Version': '1.0.0',"
                "   'ConfigurationName' : 'AmbitScenarioConfiguration',"
                "   'BulkScenarioName' : 'AmbitScenario',"
                "   'TimeOfDayTypes' :"
                "   {"
                "       'Morning': true,"
                "       'Noon' : false,"
                "       'Evening' : true,"
                "       'Night': false"
                "   },"
                "   'WeatherTypes':"
                "   {"
                "       'Sunny': true,"
                "       'Rainy' : true,"
                "       'Foggy' : false"
                "   },"
                "   'PedestrianDensity':"
                "   {"
                "       'Min': 0,"
                "       'Max' : 0.10000000149011612,"
                "       'Increment' : 0.10000000149011612"
                "   },"
                "   'TrafficDensity':"
                "   {"
                "       'Min': 0,"
                "       'Max' : 0.10000000149011612,"
                "       'Increment' : 0.10000000149011612"
                "   },"
                "   'NumberOfPermutations': 16"
                "}"
            ).Replace(TEXT("'"), TEXT("\""));
            Json = FJsonHelpers::DeserializeJson(JsonFString);
        });

        It("when ConfigurationName is 'AmbitScenarioConfiguration'", [this]()
        {
            BulkConfig.DeserializeFromJson(Json);
            TestEqual("Configuration Name", BulkConfig.ConfigurationName, "AmbitScenarioConfiguration");
        });

        It("When BulkScenarioName is 'AmbitScenario'", [this]()
        {
            BulkConfig.DeserializeFromJson(Json);
            TestEqual("BulkScenario Name", BulkConfig.BatchName, "AmbitScenario");
        });

        It("When Morning and Evening in time of day types are true", [this]()
        {
            BulkConfig.DeserializeFromJson(Json);
            TestTrue("Time of day types: Morning", BulkConfig.TimeOfDayTypes.GetMorning());
            TestTrue("Time of day types: Evening", BulkConfig.TimeOfDayTypes.GetEvening());
        });

        It("When Sunny and Rainy in weather types are true", [this]()
        {
            BulkConfig.DeserializeFromJson(Json);
            TestTrue("Weather types: Sunny", BulkConfig.WeatherTypes.GetSunny());
            TestTrue("Weather types: Rainy", BulkConfig.WeatherTypes.GetRainy());
        });

        It("Pedestrian Density min and max", [this]()
        {
            BulkConfig.DeserializeFromJson(Json);
            TestEqual("The minimum of pedestrian density is", BulkConfig.PedestrianDensity.Min, 0.0f);
            TestEqual("The maximum of pedestrian density is", BulkConfig.PedestrianDensity.Max, 0.1f);
        });

        It("Vehicle Density min and max", [this]()
        {
            BulkConfig.DeserializeFromJson(Json);
            TestEqual("The minimum of vehicle density is", BulkConfig.VehicleDensity.Min, 0.0f);
            TestEqual("The maximum of vehicle density is", BulkConfig.VehicleDensity.Max, 0.1f);
        });
    });

    Describe("GenerateScenarios()", [this]()
    {
        BeforeEach([this]()
        {
            BulkConfig = FBulkScenarioConfiguration{};
        });
        It("when single permutation is expected", [this]()
        {
            // Configure for single weather variant.
            BulkConfig.WeatherTypes.SetRainy(true);

            // Configure for single pedestrian traffic variant.
            BulkConfig.PedestrianDensity.Min = 0.2f;
            BulkConfig.PedestrianDensity.Max = 0.2f;

            // Configure for single traffic variant.
            BulkConfig.VehicleDensity.Min = 0.5f;
            BulkConfig.VehicleDensity.Max = 0.5f;

            const TArray<FScenarioDefinition> GeneratedScenarios = BulkConfig.GenerateScenarios();

            // Test for expected number of permutations.
            TestEqual("Scenario count", GeneratedScenarios.Num(), 1);
            if (HasAnyErrors())
            {
                return;
            }

            // Test that the correct scenario was generated.
            const FScenarioDefinition Scenario = GeneratedScenarios[0];
            TestEqual("Precipitation", Scenario.AmbitWeatherParameters.Precipitation, 80.0f);
            TestEqual("Pedestrian Density", Scenario.PedestrianDensity, 0.2f);
            TestEqual("Vehicle Density", Scenario.VehicleDensity, 0.5f);
        });

        It("when single permutation is expected with no weather and time of day types", [this]()
        {
            // Configure for single pedestrian traffic variant.
            BulkConfig.PedestrianDensity.Min = 0.0f;
            BulkConfig.PedestrianDensity.Max = 0.0f;

            // Configure for single traffic variant.
            BulkConfig.VehicleDensity.Min = 0.0f;
            BulkConfig.VehicleDensity.Max = 0.0f;

            const TArray<FScenarioDefinition> GeneratedScenarios = BulkConfig.GenerateScenarios();

            // Test for expected number of permutations.
            TestEqual("Scenario count", GeneratedScenarios.Num(), 1);
            if (HasAnyErrors())
            {
                return;
            }

            // Test that the correct scenario was generated.
            const FScenarioDefinition Scenario = GeneratedScenarios[0];
            TestEqual("Pedestrian Density", Scenario.PedestrianDensity, 0.0f);
            TestEqual("Vehicle Density", Scenario.VehicleDensity, 0.0f);
        });

        It("when 2 weather variants are configured", [this]()
        {
            // Configure for two weather variants.
            BulkConfig.WeatherTypes.SetSunny(true);
            BulkConfig.WeatherTypes.SetRainy(true);

            // Configure for single pedestrian traffic variant.
            BulkConfig.PedestrianDensity.Min = 0.2;
            BulkConfig.PedestrianDensity.Max = 0.2;

            // Configure for single traffic variant.
            BulkConfig.VehicleDensity.Min = 0.5;
            BulkConfig.VehicleDensity.Max = 0.5;

            const TArray<FScenarioDefinition> GeneratedScenarios = BulkConfig.GenerateScenarios();

            // Test for expected number of permutations.
            TestEqual("scenario count", GeneratedScenarios.Num(), 2);
            if (HasAnyErrors())
            {
                return;
            }

            // Test that the correct scenarios were generated.
            TestEqual("The Cloudiness in Sunny day", GeneratedScenarios[0].AmbitWeatherParameters.Cloudiness, 20.0f);
            TestEqual("The Cloudiness in Rainy day", GeneratedScenarios[1].AmbitWeatherParameters.Cloudiness, 90.0f);
        });

        It("when 2 weather variant and 3 pedestrian variants are configured", [this]()
        {
            // Configure for two weather variants.
            BulkConfig.WeatherTypes.SetSunny(true);
            BulkConfig.WeatherTypes.SetFoggy(true);

            // Configure for single pedestrian traffic variant.
            BulkConfig.PedestrianDensity.Min = 0.2;
            BulkConfig.PedestrianDensity.Max = 0.4;

            // Configure for single traffic variant.
            BulkConfig.VehicleDensity.Min = 0.5;
            BulkConfig.VehicleDensity.Max = 0.5;

            const TArray<FScenarioDefinition> GeneratedScenarios = BulkConfig.GenerateScenarios();

            // Test for expected number of permutations.
            TestEqual("scenario count", GeneratedScenarios.Num(), 6);
            if (HasAnyErrors())
            {
                return;
            }

            // Test that the correct scenarios were generated.
            const auto FirstScenario = GeneratedScenarios[0];
            TestEqual("The Cloudiness in the first scenario", FirstScenario.AmbitWeatherParameters.Cloudiness, 20.0f);
            TestEqual("Pedestrian Density in the first scenario", FirstScenario.PedestrianDensity, 0.2f);

            const auto LastScenario = GeneratedScenarios[5];
            TestEqual("Cloudiness in the last scenario", LastScenario.AmbitWeatherParameters.Cloudiness, 30.f);
            TestEqual("Pedestrian Density in the last scenario", LastScenario.PedestrianDensity, 0.4f);
        });

        It(
            "when 3 weather variants, 4 time of day variants, 11 pedestrian variants and 11 traffic variants are configured",
            [this]()
            {
                // Configure for all weather variants.
                BulkConfig.WeatherTypes.SetSunny(true);
                BulkConfig.WeatherTypes.SetRainy(true);
                BulkConfig.WeatherTypes.SetFoggy(true);

                // Configure for all time of day variants.
                BulkConfig.TimeOfDayTypes.SetMorning(true);
                BulkConfig.TimeOfDayTypes.SetNoon(true);
                BulkConfig.TimeOfDayTypes.SetEvening(true);
                BulkConfig.TimeOfDayTypes.SetNight(true);

                // Configure for single pedestrian traffic variant.
                BulkConfig.PedestrianDensity.Min = 0;
                BulkConfig.PedestrianDensity.Max = 1;

                // Configure for single traffic variant.
                BulkConfig.VehicleDensity.Min = 0;
                BulkConfig.VehicleDensity.Max = 1;

                const TArray<FScenarioDefinition> GeneratedScenarios = BulkConfig.GenerateScenarios();

                // Test for expected number of permutations.
                TestEqual("scenario count", GeneratedScenarios.Num(), 3 * 4 * 11 * 11);

                // Test that the correct scenarios were generated.
                const auto FirstScenario = GeneratedScenarios[0];
                TestEqual("The Cloudiness in the first scenario", FirstScenario.AmbitWeatherParameters.Cloudiness,
                          20.0f);
                TestEqual("The Time of day in the first scenario", FirstScenario.TimeOfDay, 6.0f);
                TestEqual("Pedestrian Density in the first scenario", FirstScenario.PedestrianDensity, 0.0f);
                TestEqual("Vehicle Density in the first scenario", FirstScenario.VehicleDensity, 0.0f);

                const auto LastScenario = GeneratedScenarios[3 * 4 * 11 * 11 - 1];
                TestEqual("Cloudiness in the last scenario", LastScenario.AmbitWeatherParameters.Cloudiness, 30.f);
                TestEqual("The Time of day in the last scenario", LastScenario.TimeOfDay, 0.0f);
                TestEqual("Pedestrian Density in the last scenario", LastScenario.PedestrianDensity, 1.0f);
                TestEqual("Vehicle Density in the last scenario", LastScenario.VehicleDensity, 1.0f);
            });
    });
}