-
-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathXmlLanguageWriterCoOccurrenceRuleTests.cs
More file actions
134 lines (118 loc) · 4.92 KB
/
Copy pathXmlLanguageWriterCoOccurrenceRuleTests.cs
File metadata and controls
134 lines (118 loc) · 4.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using NUnit.Framework;
using SIL.Machine.FeatureModel;
namespace SIL.Machine.Morphology.HermitCrab;
// A Language built programmatically (e.g. by FieldWorks' HCLoader) can have
// MorphemeCoOccurrenceRules/AllomorphCoOccurrenceRules that reference a morpheme/allomorph never written
// under any Stratum -- e.g. an ad-hoc prohibition still targets an affix in a slot whose owning
// inflectional-affix template was disabled. XmlLanguageWriter must skip such rules instead of throwing.
[TestFixture]
public class XmlLanguageWriterCoOccurrenceRuleTests
{
[Test]
public void Save_MorphemeCoOccurrenceRuleReferencesUnwrittenMorpheme_DoesNotThrowAndOmitsRule()
{
Language language = BuildLanguage(out LexEntry writtenEntry, out LexEntry danglingEntry);
language.MorphemeCoOccurrenceRules.Add(
(
danglingEntry,
new MorphemeCoOccurrenceRule(
ConstraintType.Exclude,
new Morpheme[] { writtenEntry },
MorphCoOccurrenceAdjacency.Anywhere
)
)
);
string xml = SaveToTempFile(language);
Assert.That(xml, Does.Not.Contain("MorphemeCoOccurrenceRules"));
}
[Test]
public void Save_MorphemeCoOccurrenceRuleReferencesUnwrittenOtherMorpheme_DoesNotThrowAndOmitsRule()
{
Language language = BuildLanguage(out LexEntry writtenEntry, out LexEntry danglingEntry);
language.MorphemeCoOccurrenceRules.Add(
(
writtenEntry,
new MorphemeCoOccurrenceRule(
ConstraintType.Exclude,
new Morpheme[] { danglingEntry },
MorphCoOccurrenceAdjacency.Anywhere
)
)
);
string xml = SaveToTempFile(language);
Assert.That(xml, Does.Not.Contain("MorphemeCoOccurrenceRules"));
}
[Test]
public void Save_AllomorphCoOccurrenceRuleReferencesUnwrittenAllomorph_DoesNotThrowAndOmitsRule()
{
Language language = BuildLanguage(out LexEntry writtenEntry, out LexEntry danglingEntry);
language.AllomorphCoOccurrenceRules.Add(
(
danglingEntry.Allomorphs[0],
new AllomorphCoOccurrenceRule(
ConstraintType.Exclude,
new Allomorph[] { writtenEntry.Allomorphs[0] },
MorphCoOccurrenceAdjacency.Anywhere
)
)
);
string xml = SaveToTempFile(language);
Assert.That(xml, Does.Not.Contain("AllomorphCoOccurrenceRules"));
}
[Test]
public void Save_MorphemeCoOccurrenceRuleReferencesOnlyWrittenMorphemes_IsWritten()
{
Language language = BuildLanguage(out LexEntry writtenEntry, out _);
var otherEntry = new LexEntry { Id = "other", Gloss = "other" };
otherEntry.Allomorphs.Add(new RootAllomorph(new Segments(language.Strata[0].CharacterDefinitionTable, "a")));
language.Strata[0].Entries.Add(otherEntry);
language.MorphemeCoOccurrenceRules.Add(
(
writtenEntry,
new MorphemeCoOccurrenceRule(
ConstraintType.Exclude,
new Morpheme[] { otherEntry },
MorphCoOccurrenceAdjacency.Anywhere
)
)
);
string xml = SaveToTempFile(language);
Assert.That(xml, Does.Contain("MorphemeCoOccurrenceRules"));
}
private static Language BuildLanguage(out LexEntry writtenEntry, out LexEntry danglingEntry)
{
var syntacticFeatSys = new SyntacticFeatureSystem();
syntacticFeatSys.AddPartsOfSpeech(new FeatureSymbol("N", "Noun"));
syntacticFeatSys.Freeze();
var table = new CharacterDefinitionTable { Name = "table1" };
table.AddSegment("a");
var stratum = new Stratum(table) { Name = "Stratum1" };
writtenEntry = new LexEntry { Id = "written", Gloss = "written" };
writtenEntry.Allomorphs.Add(new RootAllomorph(new Segments(table, "a")));
stratum.Entries.Add(writtenEntry);
// Never added to any stratum, so XmlLanguageWriter never assigns it an id.
danglingEntry = new LexEntry { Id = "dangling", Gloss = "dangling" };
danglingEntry.Allomorphs.Add(new RootAllomorph(new Segments(table, "a")));
return new Language
{
Name = "Test",
SyntacticFeatureSystem = syntacticFeatSys,
CharacterDefinitionTables = { table },
Strata = { stratum },
};
}
private static string SaveToTempFile(Language language)
{
string path = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
try
{
Assert.DoesNotThrow(() => XmlLanguageWriter.Save(language, path));
return File.ReadAllText(path);
}
finally
{
if (File.Exists(path))
File.Delete(path);
}
}
}