|
1 | 1 | using System; |
| 2 | +using System.Linq; |
| 3 | +using BackendFramework.Helper; |
2 | 4 | using BackendFramework.Interfaces; |
| 5 | +using BackendFramework.Models; |
3 | 6 | using BackendFramework.Services; |
4 | 7 | using NUnit.Framework; |
| 8 | +using SIL.DictionaryServices.Model; |
5 | 9 |
|
6 | 10 | namespace Backend.Tests.Services |
7 | 11 | { |
@@ -74,5 +78,247 @@ public void TestStoreRetrieveDeleteImport() |
74 | 78 | Assert.That(_liftService.DeleteImport(UserId), Is.True); |
75 | 79 | Assert.That(_liftService.RetrieveImport(UserId), Is.Null); |
76 | 80 | } |
| 81 | + |
| 82 | + [Test] |
| 83 | + public void TestCreateLexEntryWithoutAudio() |
| 84 | + { |
| 85 | + var project = Util.RandomProject(); |
| 86 | + var word = Util.RandomWord(project.Id); |
| 87 | + word.Vernacular = "test'vern-with.punct&which;will\tbe\"escaped/later<by*lift writer"; |
| 88 | + word.Created = "2020-01-01T00:00:00.000Z"; |
| 89 | + word.Modified = "2021-02-03T04:05:06.789Z"; |
| 90 | + word.Flag = new("flag text"); |
| 91 | + word.Note = new("en", "note text"); |
| 92 | + |
| 93 | + var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []); |
| 94 | + |
| 95 | + Assert.That(entry.Id, Does.StartWith(word.Vernacular)); |
| 96 | + Assert.That(entry.Id, Does.EndWith(word.Guid.ToString())); |
| 97 | + Assert.That(entry.Guid, Is.EqualTo(word.Guid)); |
| 98 | + Assert.That(entry.CreationTime, Is.Not.EqualTo(default(DateTime))); |
| 99 | + Assert.That(entry.ModificationTime, Is.Not.EqualTo(default(DateTime))); |
| 100 | + Assert.That(entry.ModifiedTimeIsLocked, Is.True); |
| 101 | + |
| 102 | + // Check vernacular |
| 103 | + var vernBcp47 = project.VernacularWritingSystem.Bcp47; |
| 104 | + var vernForm = entry.LexicalForm.Find(vernBcp47); |
| 105 | + Assert.That(vernForm, Is.Not.Null); |
| 106 | + Assert.That(vernForm.Form, Is.EqualTo(word.Vernacular)); |
| 107 | + |
| 108 | + // Check note |
| 109 | + Assert.That(entry.Notes, Has.Count.EqualTo(1)); |
| 110 | + var noteForms = entry.Notes.First().Forms; |
| 111 | + Assert.That(noteForms, Has.Length.EqualTo(1)); |
| 112 | + Assert.That(noteForms.First().Form, Is.EqualTo(word.Note.Text)); |
| 113 | + |
| 114 | + // Check flag |
| 115 | + var flagField = entry.Fields.FirstOrDefault(f => f.Type == LiftHelper.FlagFieldTag); |
| 116 | + Assert.That(flagField, Is.Not.Null); |
| 117 | + Assert.That(flagField.Forms, Has.Length.EqualTo(1)); |
| 118 | + Assert.That(flagField.Forms.First().Form, Is.EqualTo(word.Flag.Text)); |
| 119 | + |
| 120 | + // Check senses |
| 121 | + Assert.That(entry.Senses, Has.Count.EqualTo(word.Senses.Count)); |
| 122 | + |
| 123 | + Assert.That(entry.Pronunciations, Is.Empty); |
| 124 | + } |
| 125 | + |
| 126 | + [Test] |
| 127 | + public void TestCreateLexEntryWithoutAudioCitationForm() |
| 128 | + { |
| 129 | + var project = Util.RandomProject(); |
| 130 | + var word = Util.RandomWord(project.Id); |
| 131 | + word.Vernacular = "citation-form-of-entry"; |
| 132 | + word.UsingCitationForm = true; |
| 133 | + |
| 134 | + var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []); |
| 135 | + |
| 136 | + var vernBcp47 = project.VernacularWritingSystem.Bcp47; |
| 137 | + var citationForm = entry.CitationForm.Find(vernBcp47); |
| 138 | + Assert.That(citationForm, Is.Not.Null); |
| 139 | + Assert.That(citationForm.Form, Is.EqualTo("citation-form-of-entry")); |
| 140 | + Assert.That(entry.LexicalForm.Find(vernBcp47), Is.Null); |
| 141 | + } |
| 142 | + |
| 143 | + [Test] |
| 144 | + public void TestCreateLexEntryWithoutAudioFlagInactive() |
| 145 | + { |
| 146 | + var project = Util.RandomProject(); |
| 147 | + var word = Util.RandomWord(project.Id); |
| 148 | + word.Flag = new() { Active = false, Text = "should not appear" }; |
| 149 | + |
| 150 | + var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []); |
| 151 | + |
| 152 | + var flagField = entry.Fields.FirstOrDefault(f => f.Type == LiftHelper.FlagFieldTag); |
| 153 | + Assert.That(flagField, Is.Null); |
| 154 | + } |
| 155 | + |
| 156 | + [Test] |
| 157 | + public void TestCreateLexEntryWithoutAudioFlagTextEmptyFiller() |
| 158 | + { |
| 159 | + var project = Util.RandomProject(); |
| 160 | + var word = Util.RandomWord(project.Id); |
| 161 | + word.Flag = new() { Active = true, Text = " " }; |
| 162 | + |
| 163 | + var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []); |
| 164 | + |
| 165 | + var flagField = entry.Fields.FirstOrDefault(f => f.Type == LiftHelper.FlagFieldTag); |
| 166 | + Assert.That(flagField, Is.Not.Null); |
| 167 | + Assert.That(flagField.Forms, Has.Length.EqualTo(1)); |
| 168 | + Assert.That(flagField.Forms.First().Form, Is.EqualTo("***")); |
| 169 | + } |
| 170 | + |
| 171 | + [Test] |
| 172 | + public void TestCreateLexEntryWithoutAudioBlankNote() |
| 173 | + { |
| 174 | + var project = Util.RandomProject(); |
| 175 | + var word = Util.RandomWord(project.Id); |
| 176 | + word.Note = new(); |
| 177 | + |
| 178 | + var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []); |
| 179 | + |
| 180 | + Assert.That(entry.Notes, Is.Empty); |
| 181 | + } |
| 182 | + |
| 183 | + [Test] |
| 184 | + public void TestCreateLexSense() |
| 185 | + { |
| 186 | + var sense = Util.RandomSense(); |
| 187 | + sense.Definitions.Add(new() { Language = "fr", Text = "defr" }); |
| 188 | + sense.Glosses.AddRange([new() { Language = "en", Def = "gen" }, new() { Language = "es", Def = "ges" }]); |
| 189 | + sense.GrammaticalInfo = new() { CatGroup = GramCatGroup.Noun, GrammaticalCategory = "n" }; |
| 190 | + sense.SemanticDomains = [new() { Id = "1", Name = "Universe" }]; |
| 191 | + |
| 192 | + var lexSense = LiftService.CreateLexSense(sense, []); |
| 193 | + |
| 194 | + Assert.That(lexSense.Id, Is.EqualTo(sense.Guid.ToString())); |
| 195 | + |
| 196 | + // Check definition |
| 197 | + var frDef = lexSense.Definition.Find("fr"); |
| 198 | + Assert.That(frDef, Is.Not.Null); |
| 199 | + Assert.That(frDef.Form, Is.EqualTo("defr")); |
| 200 | + |
| 201 | + // Check glosses |
| 202 | + var enGloss = lexSense.Gloss.Find("en"); |
| 203 | + Assert.That(enGloss, Is.Not.Null); |
| 204 | + Assert.That(enGloss.Form, Is.EqualTo("gen")); |
| 205 | + var esGloss = lexSense.Gloss.Find("es"); |
| 206 | + Assert.That(esGloss, Is.Not.Null); |
| 207 | + Assert.That(esGloss.Form, Is.EqualTo("ges")); |
| 208 | + |
| 209 | + // Check grammatical info |
| 210 | + var hasPos = lexSense.Properties.Any(p => p.Key == LexSense.WellKnownProperties.PartOfSpeech); |
| 211 | + Assert.That(hasPos, Is.True); |
| 212 | + |
| 213 | + // Check semantic domains |
| 214 | + var semDomProps = lexSense.Properties |
| 215 | + .Where(p => p.Key == LexSense.WellKnownProperties.SemanticDomainDdp4).ToList(); |
| 216 | + Assert.That(semDomProps, Has.Count.EqualTo(1)); |
| 217 | + Assert.That(semDomProps.First().Value.ToString(), Is.EqualTo("1 Universe")); |
| 218 | + } |
| 219 | + |
| 220 | + [Test] |
| 221 | + public void TestCreateLexSenseDuplicatesInALanguage() |
| 222 | + { |
| 223 | + var sense = new Sense |
| 224 | + { |
| 225 | + Definitions = [new() { Language = "en", Text = "1st" }, new() { Language = "en", Text = "2nd" }], |
| 226 | + Glosses = [new() { Language = "es", Def = "1o" }, new() { Language = "es", Def = "2o" }] |
| 227 | + }; |
| 228 | + |
| 229 | + var lexSense = LiftService.CreateLexSense(sense, []); |
| 230 | + |
| 231 | + // Both definitions should be merged with default separator |
| 232 | + var enDef = lexSense.Definition.Find("en"); |
| 233 | + Assert.That(enDef, Is.Not.Null); |
| 234 | + Assert.That(enDef.Form, Is.EqualTo("1st;2nd")); |
| 235 | + var esGloss = lexSense.Gloss.Find("es"); |
| 236 | + Assert.That(esGloss, Is.Not.Null); |
| 237 | + Assert.That(esGloss.Form, Is.EqualTo("1o;2o")); |
| 238 | + } |
| 239 | + |
| 240 | + [Test] |
| 241 | + public void TestCreateLexSenseCustomSeparator() |
| 242 | + { |
| 243 | + var sense = new Sense |
| 244 | + { |
| 245 | + Definitions = [new() { Language = "en", Text = "1st" }, new() { Language = "en", Text = "2nd" }] |
| 246 | + }; |
| 247 | + |
| 248 | + var lexSense = LiftService.CreateLexSense(sense, [], separator: " | "); |
| 249 | + |
| 250 | + var enDef = lexSense.Definition.Find("en"); |
| 251 | + Assert.That(enDef, Is.Not.Null); |
| 252 | + Assert.That(enDef.Form, Is.EqualTo("1st | 2nd")); |
| 253 | + } |
| 254 | + |
| 255 | + [Test] |
| 256 | + public void TestCreateLexSenseNoGrammaticalInfo() |
| 257 | + { |
| 258 | + var sense = new Sense { GrammaticalInfo = new() { CatGroup = GramCatGroup.Unspecified } }; |
| 259 | + |
| 260 | + var lexSense = LiftService.CreateLexSense(sense, []); |
| 261 | + |
| 262 | + var hasPos = lexSense.Properties.Any(p => p.Key == LexSense.WellKnownProperties.PartOfSpeech); |
| 263 | + Assert.That(hasPos, Is.False); |
| 264 | + } |
| 265 | + |
| 266 | + [Test] |
| 267 | + public void TestCreateLexSenseSemanticDomainWithoutName() |
| 268 | + { |
| 269 | + var sense = new Sense { SemanticDomains = [new() { Id = "9.9" }] }; |
| 270 | + |
| 271 | + // Semantic domain not in dictionary |
| 272 | + var lexSense = LiftService.CreateLexSense(sense, []); |
| 273 | + |
| 274 | + var semDomProps = lexSense.Properties |
| 275 | + .Where(p => p.Key == LexSense.WellKnownProperties.SemanticDomainDdp4).ToList(); |
| 276 | + Assert.That(semDomProps, Has.Count.EqualTo(1)); |
| 277 | + Assert.That(semDomProps.First().Value.ToString(), Is.EqualTo("9.9")); |
| 278 | + } |
| 279 | + |
| 280 | + [Test] |
| 281 | + public void TestCreateLexSenseSemanticDomainPrefersNameFromDictionary() |
| 282 | + { |
| 283 | + var sense = new Sense { SemanticDomains = [new() { Id = "9.9", Name = "no!" }] }; |
| 284 | + |
| 285 | + // Semantic domain not in dictionary |
| 286 | + var lexSense = LiftService.CreateLexSense(sense, new() { ["9.9"] = "yes!" }); |
| 287 | + |
| 288 | + var semDomProps = lexSense.Properties |
| 289 | + .Where(p => p.Key == LexSense.WellKnownProperties.SemanticDomainDdp4).ToList(); |
| 290 | + Assert.That(semDomProps, Has.Count.EqualTo(1)); |
| 291 | + Assert.That(semDomProps.First().Value.ToString(), Does.EndWith("yes!")); |
| 292 | + } |
| 293 | + |
| 294 | + [Test] |
| 295 | + public void TestCreateLexPhoneticNoSpeaker() |
| 296 | + { |
| 297 | + const string audioPath = "path/to/audio.wav"; |
| 298 | + |
| 299 | + var lexPhonetic = LiftService.CreateLexPhonetic(audioPath); |
| 300 | + |
| 301 | + Assert.That(lexPhonetic.Forms, Has.Length.EqualTo(1)); |
| 302 | + var hrefForm = lexPhonetic.Find("href"); |
| 303 | + Assert.That(hrefForm, Is.Not.Null); |
| 304 | + Assert.That(hrefForm.Form, Is.EqualTo(audioPath)); |
| 305 | + } |
| 306 | + |
| 307 | + [Test] |
| 308 | + public void TestCreateLexPhoneticWithSpeaker() |
| 309 | + { |
| 310 | + const string audioPath = "path/to/audio.mp3"; |
| 311 | + var speaker = new Speaker { Id = "speaker1", Name = "Mr. E", ProjectId = "proj1" }; |
| 312 | + |
| 313 | + var lexPhonetic = LiftService.CreateLexPhonetic(audioPath, speaker); |
| 314 | + |
| 315 | + Assert.That(lexPhonetic.Forms, Has.Length.EqualTo(2)); |
| 316 | + var hrefForm = lexPhonetic.Find("href"); |
| 317 | + Assert.That(hrefForm, Is.Not.Null); |
| 318 | + Assert.That(hrefForm.Form, Is.EqualTo(audioPath)); |
| 319 | + var speakerForm = lexPhonetic.Find("en"); |
| 320 | + Assert.That(speakerForm, Is.Not.Null); |
| 321 | + Assert.That(speakerForm.Form, Is.EqualTo("Speaker: Mr. E")); |
| 322 | + } |
77 | 323 | } |
78 | 324 | } |
0 commit comments