public void VariablesAreOutputted()
    {
        const string outputModName = "outputMod2";
        var          titles        = new Title.LandedTitles();

        titles.Variables.Add("default_ai_priority", 20);
        titles.Variables.Add("default_ai_aggressiveness", 40);

        var titleHistoryPath = Path.Combine("output", outputModName, "history", "titles");

        SystemUtils.TryCreateFolder(titleHistoryPath);
        var landedTitlesPath = Path.Combine("output", outputModName, "common", "landed_titles", "00_landed_titles.txt");

        SystemUtils.TryCreateFolder(CommonFunctions.GetPath(landedTitlesPath));

        TitlesOutputter.OutputTitles(outputModName, titles, IMPERATOR_DE_JURE.NO);

        Assert.True(File.Exists(landedTitlesPath));
        using var landedTitlesFile = File.OpenRead(landedTitlesPath);
        var reader = new StreamReader(landedTitlesFile);

        Assert.Equal("@default_ai_priority=20", reader.ReadLine());
        Assert.Equal("@default_ai_aggressiveness=40", reader.ReadLine());
        Assert.True(reader.EndOfStream);
    }
示例#2
0
        public void TitlesCanBeOverriddenByMods()
        {
            var reader = new BufferedReader(
                "e_empire1 = { k_kingdom2 = { d_duchy3 = { b_barony4 = { province = 12 } } } }\n" +
                "c_county5 = { landless = yes }\n"
                );

            var titles = new Title.LandedTitles();

            titles.LoadTitles(reader);

            var reader2 = new BufferedReader(
                "b_barony4 = { province = 15 }\n" +
                "c_county5 = { landless = no }\n"
                );

            titles.LoadTitles(reader2);

            var barony = titles["b_barony4"];
            var county = titles["c_county5"];

            Assert.Equal(5, titles.Count);
            Assert.Equal((ulong)15, barony.Province);
            Assert.False(county.Landless);
        }
示例#3
0
    public void InitializeFromImperator(
        Imperator.Provinces.Province impProvince,
        Title.LandedTitles landedTitles,
        CultureMapper cultureMapper,
        ReligionMapper religionMapper
        )
    {
        ImperatorProvince = impProvince;

        // If we're initializing this from Imperator provinces, then having an owner or being a wasteland/sea is not a given -
        // there are uncolonized provinces in Imperator, also uninhabitables have culture and religion.

        var impOwnerCountry = ImperatorProvince.OwnerCountry;

        if (impOwnerCountry is not null)
        {
            ownerTitle = impOwnerCountry.CK3Title;             // linking to our holder's title
        }

        // Religion first
        SetReligionFromImperator(religionMapper);

        // Then culture
        SetCultureFromImperator(cultureMapper);

        // Holding type
        SetHoldingFromImperator(landedTitles);

        details.Buildings.Clear();
    }
示例#4
0
    public void ImportImperatorProvinces(Imperator.World impWorld, Title.LandedTitles titles, CultureMapper cultureMapper, ReligionMapper religionMapper, ProvinceMapper provinceMapper)
    {
        Logger.Info("Importing Imperator Provinces...");
        var counter = 0;

        // Imperator provinces map to a subset of CK3 provinces. We'll only rewrite those we are responsible for.
        foreach (var province in this)
        {
            var impProvinces = provinceMapper.GetImperatorProvinceNumbers(province.Id);
            // Provinces we're not affecting will not be in this list.
            if (impProvinces.Count == 0)
            {
                continue;
            }
            // Next, we find what province to use as its initializing source.
            var sourceProvince = DetermineProvinceSource(impProvinces, impWorld);
            if (sourceProvince is null)
            {
                Logger.Warn($"Could not determine source province for CK3 province {province.Id}!");
                continue;                 // MISMAP, or simply have mod provinces loaded we're not using.
            }
            province.InitializeFromImperator(sourceProvince.Value.Value, titles, cultureMapper, religionMapper);
            // And finally, initialize it.
            ++counter;
        }
        Logger.Info($"{impWorld.Provinces.Count} Imperator provinces imported into {counter} CK3 provinces.");
    }
示例#5
0
    public static void OutputTitles(string outputModName, Title.LandedTitles titles, IMPERATOR_DE_JURE deJure)
    {
        var outputPath = Path.Combine("output", outputModName, "common", "landed_titles", "00_landed_titles.txt");

        using var outputStream = File.OpenWrite(outputPath);
        using var output       = new StreamWriter(outputStream, System.Text.Encoding.UTF8);

        foreach (var(name, value) in titles.Variables)
        {
            output.WriteLine($"@{name}={value}");
        }

        // titles with a de jure liege will be outputted under the liege
        var topDeJureTitles = titles.Where(t => t.DeJureLiege is null);

        output.Write(PDXSerializer.Serialize(topDeJureTitles, string.Empty, false));

        if (deJure == IMPERATOR_DE_JURE.REGIONS)
        {
            var srcPath = Path.Combine("blankMod", "optionalFiles", "ImperatorDeJure", "common", "landed_titles");
            var dstPath = Path.Combine("output", outputModName, "common", "landed_titles");
            if (!SystemUtils.TryCopyFolder(srcPath, dstPath))
            {
                Logger.Error("Could not copy ImperatorDeJure landed titles!");
            }
        }

        OutputTitlesHistory(outputModName, titles);
    }
示例#6
0
        public void TitlesDefaultToEmpty()
        {
            var reader = new BufferedReader(string.Empty);
            var titles = new Title.LandedTitles();

            titles.LoadTitles(reader);

            Assert.Empty(titles);
        }
示例#7
0
        public void RemoveEmployerIdFromLandedCharacters(Title.LandedTitles titles, Date conversionDate)
        {
            var landedCharacterIds = titles.GetHolderIds(conversionDate);

            foreach (var character in this.Where(character => landedCharacterIds.Contains(character.Id)))
            {
                character.EmployerId = null;
            }
        }
示例#8
0
        public void LocationServicesSucceedsForProvinceField()
        {
            var          mapper       = new CK3RegionMapper();
            var          landedTitles = new Title.LandedTitles();
            const string regionPath   = "TestFiles/regions/CK3RegionMapperTests/LocationServicesSucceedsForProvinceField.txt";

            mapper.LoadRegions(landedTitles, regionPath, islandRegionPath);

            Assert.True(mapper.ProvinceIsInRegion(69, "test_region"));
        }
示例#9
0
        public CK3RegionMapper(string ck3Path, Title.LandedTitles landedTitles)
        {
            Logger.Info("Initializing Geography...");

            var ck3MapDataPath       = Path.Combine(ck3Path, "game", "map_data");
            var regionFilePath       = Path.Combine(ck3MapDataPath, "geographical_region.txt");
            var islandRegionFilePath = Path.Combine(ck3MapDataPath, "island_region.txt");

            LoadRegions(landedTitles, regionFilePath, islandRegionFilePath);
        }
示例#10
0
        public void SetHoldingLogicWorks()
        {
            var reader1 = new BufferedReader(" = { province_rank=city_metropolis }");
            var reader2 = new BufferedReader(" = { province_rank=city fort=yes }");
            var reader3 = new BufferedReader(" = { province_rank=city }");
            var reader4 = new BufferedReader(" = { province_rank=settlement holy_site = 69 fort=yes }");
            var reader5 = new BufferedReader(" = { province_rank=settlement fort=yes }");
            var reader6 = new BufferedReader(" = { province_rank=settlement }");

            var imperatorCountry = new ImperatorToCK3.Imperator.Countries.Country(1);
            var impProvince      = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader1, 42);

            impProvince.LinkOwnerCountry(imperatorCountry);
            var impProvince2 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader2, 43);

            impProvince2.LinkOwnerCountry(imperatorCountry);
            var impProvince3 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader3, 44);

            impProvince3.LinkOwnerCountry(imperatorCountry);
            var impProvince4 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader4, 45);

            impProvince4.LinkOwnerCountry(imperatorCountry);
            var impProvince5 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader5, 46);

            impProvince5.LinkOwnerCountry(imperatorCountry);
            var impProvince6 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader6, 47);

            impProvince6.LinkOwnerCountry(imperatorCountry);

            var province1 = new Province();
            var province2 = new Province();
            var province3 = new Province();
            var province4 = new Province();
            var province5 = new Province();
            var province6 = new Province();

            var landedTitles   = new Title.LandedTitles();
            var cultureMapper  = new CultureMapper();
            var religionMapper = new ReligionMapper();

            province1.InitializeFromImperator(impProvince, landedTitles, cultureMapper, religionMapper);
            province2.InitializeFromImperator(impProvince2, landedTitles, cultureMapper, religionMapper);
            province3.InitializeFromImperator(impProvince3, landedTitles, cultureMapper, religionMapper);
            province4.InitializeFromImperator(impProvince4, landedTitles, cultureMapper, religionMapper);
            province5.InitializeFromImperator(impProvince5, landedTitles, cultureMapper, religionMapper);
            province6.InitializeFromImperator(impProvince6, landedTitles, cultureMapper, religionMapper);

            Assert.Equal("city_holding", province1.Holding);
            Assert.Equal("castle_holding", province2.Holding);
            Assert.Equal("city_holding", province3.Holding);
            Assert.Equal("church_holding", province4.Holding);
            Assert.Equal("castle_holding", province5.Holding);
            Assert.Equal("none", province6.Holding);
        }
示例#11
0
        public void MultipleDuchiesCanBeLoaded()
        {
            var reader = new BufferedReader("duchies = { d_ivrea d_athens d_oppo }");
            var region = CK3Region.Parse("region1", reader);

            Assert.Empty(region.Duchies);             // not linked yet

            var titles = new Title.LandedTitles();

            region.LinkDuchy(titles.Add("d_ivrea"));
            region.LinkDuchy(titles.Add("d_athens"));
            region.LinkDuchy(titles.Add("d_oppo"));
            Assert.Equal(3, region.Duchies.Count);
        }
示例#12
0
        public void PurgeLandlessVanillaCharacters(Title.LandedTitles titles, Date ck3BookmarkDate)
        {
            var landedCharacterIds = titles.GetHolderIds(ck3BookmarkDate);
            var farewellIds        = dict.Keys.Where(
                id => !id.StartsWith("imperator") && !landedCharacterIds.Contains(id)
                );

            foreach (var characterId in farewellIds)
            {
                this[characterId].BreakAllLinks();
                Remove(characterId);
            }
            Logger.Info($"Purged {farewellIds.Count()} landless vanilla characters.");
        }
示例#13
0
        public void DuchyCanBeLoaded()
        {
            var reader = new BufferedReader("duchies = { d_duchy }");
            var region = CK3Region.Parse("region1", reader);

            Assert.Empty(region.Duchies);             // not linked yet

            var titles = new Title.LandedTitles();

            region.LinkDuchy(titles.Add("d_duchy"));
            Assert.Collection(region.Duchies,
                              item => Assert.Equal("d_duchy", item.Key)
                              );
        }
示例#14
0
        public void RegionMapperCanBeEnabled()
        {
            // We start humble, it's a machine.
            var          mapper       = new CK3RegionMapper();
            var          landedTitles = new Title.LandedTitles();
            const string regionPath   = "TestFiles/regions/CK3RegionMapperTests/empty.txt";

            mapper.LoadRegions(landedTitles, regionPath, islandRegionPath);
            Assert.False(mapper.ProvinceIsInRegion(1, "test"));
            Assert.False(mapper.RegionNameIsValid("test"));
            Assert.Null(mapper.GetParentCountyName(1));
            Assert.Null(mapper.GetParentDuchyName(1));
            Assert.Null(mapper.GetParentRegionName(1));
        }
示例#15
0
        public void LocationServicesSucceedsForCountyField()
        {
            var mapper             = new CK3RegionMapper();
            var landedTitles       = new Title.LandedTitles();
            var landedTitlesReader = new BufferedReader(
                "c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } }"
                );

            landedTitles.LoadTitles(landedTitlesReader);
            const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LocationServicesSucceedsForCountyField.txt";

            mapper.LoadRegions(landedTitles, regionPath, islandRegionPath);

            Assert.True(mapper.ProvinceIsInRegion(79, "test_region"));
        }
    public static void OutputCoas(string outputModName, Title.LandedTitles titles)
    {
        // dumping all into one file
        var path = Path.Combine("output", outputModName, "common", "coat_of_arms", "coat_of_arms", "fromImperator.txt");

        using var output = new StreamWriter(path);
        foreach (var title in titles)
        {
            var coa = title.CoA;
            if (coa is not null)
            {
                output.WriteLine($"{title.Id}={coa}");
            }
        }
    }
示例#17
0
        public void LinkedRegionWillFailForProvinceMismatch()
        {
            var reader = new BufferedReader("duchies = { d_ivrea d_athens d_oppo }");
            var region = CK3Region.Parse("region1", reader);

            var titles  = new Title.LandedTitles();
            var reader2 = new BufferedReader(
                "{ c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } } }"
                );
            var duchy2 = titles.Add("d_athens");

            duchy2.LoadTitles(reader2);

            region.LinkDuchy(duchy2);

            Assert.False(region.ContainsProvince(7));
        }
示例#18
0
        public void LoadingBrokenCountyWillThrowException()
        {
            var mapper             = new CK3RegionMapper();
            var landedTitles       = new Title.LandedTitles();
            var landedTitlesReader = new BufferedReader(
                "k_anglia = { d_aquitane = { c_mers_broken = { b_hgy = { province = 69 } } } } \n"
                );

            landedTitles.LoadTitles(landedTitlesReader);
            const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LoadingBrokenCountyWillThrowException.txt";

            void action() => mapper.LoadRegions(landedTitles, regionPath, islandRegionPath);

            KeyNotFoundException exception = Assert.Throws <KeyNotFoundException>(action);

            Assert.Equal("Region's test_region county c_mers does not exist!", exception.Message);
        }
示例#19
0
        public void RegionCanBeLinkedToDuchy()
        {
            var reader = new BufferedReader("duchies = { d_ivrea d_athens d_oppo }");
            var region = CK3Region.Parse("region1", reader);

            var titles  = new Title.LandedTitles();
            var reader2 = new BufferedReader(
                "{ c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } } }"
                );
            var duchy2 = titles.Add("d_athens");

            duchy2.LoadTitles(reader2);

            Assert.False(region.Duchies.ContainsKey("d_athens"));             // not linked yet
            region.LinkDuchy(duchy2);
            Assert.NotNull(region.Duchies["d_athens"]);
        }
示例#20
0
        public void LocationServicesFailForNonsense()
        {
            var mapper             = new CK3RegionMapper();
            var landedTitles       = new Title.LandedTitles();
            var landedTitlesReader = new BufferedReader(
                "k_ugada = { d_wakaba = { c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } } } } \n" +
                "k_ghef = { d_hujhu = { c_defff = { b_cringe = { province = 6 } b_newbarony2 = { province = 4 } } } }"
                );

            landedTitles.LoadTitles(landedTitlesReader);
            const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LocationServicesFailForNonsense.txt";

            mapper.LoadRegions(landedTitles, regionPath, islandRegionPath);

            Assert.False(mapper.ProvinceIsInRegion(1, "nonsense"));
            Assert.False(mapper.ProvinceIsInRegion(6, "test_superregion"));
        }
示例#21
0
    public static void OutputSuccessionTriggers(string outputModName, Title.LandedTitles landedTitles, Date ck3BookmarkDate)
    {
        var outputPath = Path.Combine("output", outputModName, "common", "scripted_triggers", "IRToCK3_succession_triggers.txt");

        using var outputStream = File.OpenWrite(outputPath);
        using var output       = new StreamWriter(outputStream, System.Text.Encoding.UTF8);

        var primogenitureTitles = new List <string>();
        var seniorityTitles     = new List <string>();

        foreach (var landedTitle in landedTitles)
        {
            if (landedTitle.GetDeFactoLiege(ck3BookmarkDate) is not null)
            {
                continue;
            }

            if (landedTitle.SuccessionLaws.Contains("single_heir_succession_law"))
            {
                primogenitureTitles.Add(landedTitle.Id);
            }
            if (landedTitle.SuccessionLaws.Contains("single_heir_dynasty_house"))
            {
                seniorityTitles.Add(landedTitle.Id);
            }
        }

        output.WriteLine("historical_succession_access_single_heir_succession_law_trigger={");
        output.WriteLine("\tOR={");
        foreach (var primogenitureTitle in primogenitureTitles)
        {
            output.WriteLine($"\t\thas_title=title:{primogenitureTitle}");
        }
        output.WriteLine("\t}");
        output.WriteLine("}");

        output.WriteLine("historical_succession_access_single_heir_dynasty_house_trigger={");
        output.WriteLine("\tOR={");
        foreach (var seniorityTitle in seniorityTitles)
        {
            output.WriteLine($"\t\thas_title=title:{seniorityTitle}");
        }
        output.WriteLine("\t}");
        output.WriteLine("}");
    }
示例#22
0
        public void LinkedRegionCanLocateProvince()
        {
            var reader = new BufferedReader("duchies = { d_ivrea d_athens d_oppo }");
            var region = CK3Region.Parse("region1", reader);

            var titles  = new Title.LandedTitles();
            var reader2 = new BufferedReader(
                "= { c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } } }"
                );
            var duchy2 = titles.Add("d_athens");

            duchy2.LoadTitles(reader2);

            region.LinkDuchy(duchy2);

            Assert.True(region.ContainsProvince(79));
            Assert.True(region.ContainsProvince(56));
        }
示例#23
0
        public void WrongParentLocationsReturnNull()
        {
            var mapper             = new CK3RegionMapper();
            var landedTitles       = new Title.LandedTitles();
            var landedTitlesReader = new BufferedReader(
                "d_testduchy = { 1 2 3 } \n" +
                "d_testduchy2 = { 4 5 6 } "
                );

            landedTitles.LoadTitles(landedTitlesReader);
            const string regionPath = "TestFiles/regions/CK3RegionMapperTests/WrongParentLocationsReturnNull.txt";

            mapper.LoadRegions(landedTitles, regionPath, islandRegionPath);

            Assert.Null(mapper.GetParentCountyName(7));
            Assert.Null(mapper.GetParentDuchyName(7));
            Assert.Null(mapper.GetParentRegionName(7));
        }
示例#24
0
        public void LocationServicesCorrectlyFail()
        {
            var mapper             = new CK3RegionMapper();
            var landedTitles       = new Title.LandedTitles();
            var landedTitlesReader = new BufferedReader(
                "d_testduchy = { 1 2 3 } \n" +
                "d_testduchy2 = { 4 5 6 } "
                );

            landedTitles.LoadTitles(landedTitlesReader);
            const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LocationServicesCorrectlyFail.txt";

            mapper.LoadRegions(landedTitles, regionPath, islandRegionPath);

            Assert.False(mapper.ProvinceIsInRegion(4, "d_testduchy"));             // province in different duchy
            Assert.False(mapper.ProvinceIsInRegion(9, "d_testduchy"));             // province missing completely
            Assert.False(mapper.ProvinceIsInRegion(5, "test_region"));             // province in different region
        }
示例#25
0
        public void TitlesCanBeLoadedRecursively()
        {
            var reader = new BufferedReader(
                "e_empire1 = { k_kingdom2 = { d_duchy3 = { b_barony4 = { province = 12 } } } }\n" +
                "c_county5 = { landless = yes }\n"
                );

            var titles = new Title.LandedTitles();

            titles.LoadTitles(reader);

            var barony = titles["b_barony4"];
            var county = titles["c_county5"];

            Assert.Equal(5, titles.Count);
            Assert.Equal((ulong)12, barony.Province);
            Assert.True(county.Landless);
        }
示例#26
0
        public void TitlesCanBeLoaded()
        {
            var reader = new BufferedReader(
                "b_barony = { province = 12 }\n" +
                "c_county = { landless = yes }\n"
                );

            var titles = new Title.LandedTitles();

            titles.LoadTitles(reader);

            var barony = titles["b_barony"];
            var county = titles["c_county"];

            Assert.Equal(2, titles.Count);
            Assert.Equal((ulong)12, barony.Province);
            Assert.True(county.Landless);
        }
示例#27
0
    private static void OutputTitlesHistory(string outputModName, Title.LandedTitles titles)
    {
        //output title history
        var alreadyOutputtedTitles = new HashSet <string>();

        foreach (var title in titles)
        {
            // first output kingdoms + their de jure vassals to files named after the kingdoms

            if (title.Rank != TitleRank.kingdom || title.DeJureVassals.Count == 0)
            {
                // title is a not de jure kingdom
                continue;
            }

            var historyOutputPath = Path.Combine("output", outputModName, "history", "titles", $"{title.Id}.txt");
            using var historyOutput = new StreamWriter(historyOutputPath);             // output the kingdom's history
            title.OutputHistory(historyOutput);
            alreadyOutputtedTitles.Add(title.Id);

            // output the kingdom's de jure vassals' history
            foreach (var(deJureVassalName, deJureVassal) in title.GetDeJureVassalsAndBelow())
            {
                deJureVassal.OutputHistory(historyOutput);
                alreadyOutputtedTitles.Add(deJureVassalName);
            }
        }

        var otherTitlesPath = Path.Combine("output", outputModName, "history", "titles", "00_other_titles.txt");

        using (var historyOutput = new StreamWriter(otherTitlesPath)) {
            foreach (var title in titles)
            {
                // output the remaining titles
                if (alreadyOutputtedTitles.Contains(title.Id))
                {
                    continue;
                }
                title.OutputHistory(historyOutput);
                alreadyOutputtedTitles.Add(title.Id);
            }
        }
    }
示例#28
0
        public void CapitalsAreLinked()
        {
            var reader = new BufferedReader(
                "e_empire = {" +
                "\tcapital=c_county " +
                "\tk_kingdom = { d_duchy = { c_county = { b_barony = { province = 12 } } } } " +
                "}"
                );
            var titles = new Title.LandedTitles();

            titles.LoadTitles(reader);

            var empire        = titles["e_empire"];
            var capitalCounty = empire.CapitalCounty;

            Assert.NotNull(capitalCounty);
            Assert.Equal("c_county", capitalCounty.Id);
            Assert.Equal("c_county", empire.CapitalCountyId);
        }
示例#29
0
        public void LocationServicesWork()
        {
            var mapper             = new CK3RegionMapper();
            var landedTitles       = new Title.LandedTitles();
            var landedTitlesReader = new BufferedReader(
                "d_aquitane = { c_mers = { b_hgy = { province = 69 } } }"
                );

            landedTitles.LoadTitles(landedTitlesReader);
            const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LocationServicesWork.txt";

            mapper.LoadRegions(landedTitles, regionPath, islandRegionPath);

            Assert.True(mapper.ProvinceIsInRegion(69, "c_mers"));
            Assert.True(mapper.ProvinceIsInRegion(69, "d_aquitane"));
            Assert.True(mapper.ProvinceIsInRegion(69, "test_region"));
            Assert.True(mapper.ProvinceIsInRegion(69, "test_region_bigger"));
            Assert.True(mapper.ProvinceIsInRegion(69, "test_region_biggest"));
        }
示例#30
0
    public void PrimogenitureAndSeniorityTriggersAreOutputted()
    {
        const string outputModName  = "outputMod";
        var          outputFilePath = Path.Combine(
            "output",
            outputModName,
            "common",
            "scripted_triggers",
            "IRToCK3_succession_triggers.txt"
            );

        var date   = new Date(476, 1, 1);
        var titles = new Title.LandedTitles();
        var kingdomPrimogeniture = titles.Add("k_kingdom1");

        kingdomPrimogeniture.SuccessionLaws.Add("single_heir_succession_law");
        var kingdomSeniority = titles.Add("k_kingdom2");

        kingdomSeniority.SuccessionLaws.Add("single_heir_dynasty_house");
        var vassal = titles.Add("d_vassal");

        vassal.SuccessionLaws.Add("single_heir_succession_law");
        vassal.SetDeFactoLiege(kingdomPrimogeniture, date);         // has de facto liege, will not be added to the trigger
        SystemUtils.TryCreateFolder(CommonFunctions.GetPath(outputFilePath));

        SuccessionTriggersOutputter.OutputSuccessionTriggers(outputModName, titles, date);

        using var file = File.OpenRead(outputFilePath);
        var reader = new StreamReader(file);

        Assert.Equal("historical_succession_access_single_heir_succession_law_trigger={", reader.ReadLine());
        Assert.Equal("\tOR={", reader.ReadLine());
        Assert.Equal($"\t\thas_title=title:{kingdomPrimogeniture.Id}", reader.ReadLine());
        Assert.Equal("\t}", reader.ReadLine());
        Assert.Equal("}", reader.ReadLine());
        Assert.Equal("historical_succession_access_single_heir_dynasty_house_trigger={", reader.ReadLine());
        Assert.Equal("\tOR={", reader.ReadLine());
        Assert.Equal($"\t\thas_title=title:{kingdomSeniority.Id}", reader.ReadLine());
        Assert.Equal("\t}", reader.ReadLine());
        Assert.Equal("}", reader.ReadLine());
        Assert.True(reader.EndOfStream);
    }