Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions se5/BrazilianToEuropeanPortuguese.Tests/ConverterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,10 @@
Assert.Equal(expected, Converter.Convert(source, null, hint));
Assert.Equal(expected, Converter.Convert(expected, null, hint));
var noYou = new PortugueseConverter(new ConversionOptions(YouToTu: false));
Assert.Equal(noYou.Convert(source), noYou.Convert(source, null, hint));
if (source == "O que está acontecendo?")
Assert.Equal(expected, noYou.Convert(source, null, hint));
else
Assert.Equal(noYou.Convert(source), noYou.Convert(source, null, hint));
}

[Theory]
Expand Down Expand Up @@ -737,7 +740,7 @@
[InlineData("Policial Kevin Olivet atirou.", "Agente Kevin Olivet disparou.")]
[InlineData("Obrigada, policial.", "Obrigada, agente.")]
[InlineData("Não matei policial algum.", "Não matei nenhum polícia.")]
[InlineData("Foi uma ação policial.", "Foi uma ação policial.")]

Check warning on line 743 in se5/BrazilianToEuropeanPortuguese.Tests/ConverterTests.cs

View workflow job for this annotation

GitHub Actions / test

Theory method 'CorpusReviewRules' on test class 'ConverterTests' has InlineData duplicate(s). Remove redundant attribute(s) from the theory method. (https://xunit.net/xunit.analyzers/rules/xUnit1025)
[InlineData("Continuaremos procurando.", "Continuaremos a procurar.")]
[InlineData("Quatro custarão $ 200.", "Quatro custarão 200 dólares.")]
[InlineData("Ele pagou $ 10 mil.", "Ele pagou 10 mil dólares.")]
Expand Down Expand Up @@ -1778,7 +1781,7 @@
[InlineData("Esqueci o nome dele.", "Esqueci o nome dele.")]
[InlineData("Esquece isso.", "Esquece isso.")]
[InlineData("Esquece!", "Esquece!")]
[InlineData("Tudo o que lembro.", "Tudo o que lembro.")]
[InlineData("Tudo o que lembro.", "Tudo o que me lembro.")]
[InlineData("Botei o meu na reta para conseguir prender esse cara.", "Arrisquei o pescoço para conseguir prender esse tipo.")]
[InlineData("Ele colocou o dele na reta por você.", "Ele arriscou o pescoço por ti.")]
[InlineData("Não vou botar a minha na reta.", "Não vou arriscar o pescoço.")]
Expand Down
166 changes: 166 additions & 0 deletions se5/BrazilianToEuropeanPortuguese.Tests/DialogueReplyTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
using SubtitleEdit.Plugins.BrazilianToEuropeanPortuguese;
using SubtitleEdit.Plugins.Shared;

namespace BrazilianToEuropeanPortuguese.Tests;

public sealed class DialogueReplyTests
{
[Theory]
[InlineData("Não. Disse que\niria me deixar.", "No. You said you were gonna drop me off.",
"Não. Disseste que\nme ias deixar.")]
[InlineData("Não. Disse que iria me ajudar.", "No. You said you were going to help me.",
"Não. Disseste que me ias ajudar.")]
[InlineData("Sim. Disse que iria voltar.", "Yes. You said you were going to return.",
"Sim. Disseste que ias voltar.")]
[InlineData("Não. Disse que poderia ajudar.", "No. You said you could help.",
"Não. Disseste que poderias ajudar.")]
[InlineData("Não. Disse que iria me ajudar.", "No. You said you would help me.",
"Não. Disseste que me irias ajudar.")]
[InlineData("Disse que iria me proteger.", "You said you would protect me.",
"Disseste que me irias proteger.")]
[InlineData("Não. Disse que ela iria voltar.", "No. You said she would return.",
"Não. Disseste que ela iria voltar.")]
public void ReplyAndReportedClauseUseConfirmedSubjects(string source, string english, string expected)
{
var converter = new PortugueseConverter();
var reference = ReferenceHint.FromText(english);
Assert.Equal(expected, converter.Convert(source, reference: reference));
Assert.Equal(expected, converter.Convert(expected, reference: reference));
}

[Theory]
[InlineData("Ligue para João?", "Call John?", "Ligo para o João?")]
[InlineData("Ligue para Jamie?", "Call Jamie?", "Ligo para o Jamie?")]
[InlineData("Telefone para Maria?", "Phone Maria?", "Telefono para a Maria?")]
[InlineData("Pergunte ao João?", "Ask John?", "Pergunto ao João?")]
[InlineData("Espere aqui?", "Wait here?", "Espero aqui?")]
[InlineData("Faça isso?", "Do that?", "Faço isso?")]
[InlineData("Vá para casa?", "Go home?", "Vou para casa?")]
[InlineData("Ligue para o João?", "Call John?", "Ligo para o João?")]
[InlineData("Liga para João?", "Call John?", "Ligo para o João?")]
[InlineData("Ligue para Alex?", "Call Alex?", "Ligo para Alex?")]
public void ConditionalReplyQuestionAsksAboutOwnAction(string source, string english, string expected)
{
var blocks = SubRipParser.Parse("1\n00:00:01,000 --> 00:00:03,000\nE se precisar de ajuda...\n\n" +
"2\n00:00:03,010 --> 00:00:05,000\n" + source + "\n\n");
var result = SubtitleConversion.Convert(blocks, new ConversionOptions(),
english: new string?[] { "And if you need help...", english });
Assert.Equal(expected, result[1].Text);
}

[Theory]
[InlineData("Ligue para João?", "Should I call John?", "Ligo para o João?")]
[InlineData("Telefone para Maria?", "Shall I phone Maria?", "Telefono para a Maria?")]
public void ExplicitSelfQuestionDoesNotNeedPreviousCue(string source, string english, string expected) =>
Assert.Equal(expected, new PortugueseConverter().Convert(source, reference: ReferenceHint.FromText(english)));

[Theory]
[InlineData("É uma pequena parada.", "It's one little stop.", "É uma pequena paragem.")]
[InlineData("Faremos uma breve parada.", "We'll make a brief stop.", "Faremos uma breve paragem.")]
[InlineData("É a próxima parada.", "It's the next stop.", "É a próxima paragem.")]
[InlineData("São umas pequenas paradas.", "They're small stops.", "São umas pequenas paragens.")]
[InlineData("Uma parada militar.", "A military parade.", "Uma parada militar.")]
[InlineData("A mulher está parada.", "The woman is standing still.", "A mulher está parada.")]
[InlineData("É uma pequena parada.", null, "É uma pequena parada.")]
[InlineData("Vou contar uma parada.", "I'll tell you something.", "Vou contar uma coisa.")]
[InlineData("Ela contou uma parada.", "She counted one stop.", "Ela contou uma paragem.")]
public void StopSenseIsNotABlanketWordSwap(string source, string? english, string expected)
{
var converter = new PortugueseConverter();
var reference = ReferenceHint.FromText(english);
Assert.Equal(expected, converter.Convert(source, reference: reference));
Assert.Equal(expected, converter.Convert(expected, reference: reference));
}

[Fact]
public void FormalAndUncertainSubjectsStayUnchanged()
{
var converter = new PortugueseConverter();
Assert.Equal("Não. Disse que iria voltar.", converter.Convert("Não. Disse que iria voltar.",
reference: ReferenceHint.FromText("No. She said she would return.")));
Assert.Equal("Ligue para João?", converter.Convert("Ligue para João?",
reference: ReferenceHint.FromText("Call John?")));
Assert.Equal("Não. Disse que iria voltar.", converter.Convert("Não. Disse que iria voltar.",
reference: ReferenceHint.FromText("No. You said you were going to return.")! with { FormalAddress = true }));
}

[Fact]
public void CliticMovementPreservesConditionalAndOtherPersons()
{
Assert.Equal("Ele disse que me iria ajudar.", new PortugueseConverter().Convert("Ele disse que iria me ajudar."));
Assert.Equal("Ela disse que nos iria proteger.", new PortugueseConverter().Convert("Ela disse que iria nos proteger."));
Assert.Equal("Disseste que iria me ajudar.", new PortugueseConverter(new ConversionOptions(Pronouns: false))
.Convert("Disse que iria me ajudar.", reference: ReferenceHint.FromText("You said she would help me.")));
}

[Fact]
public void OptionsAndIgnoredPhrasesProtectExistingBehaviour()
{
var reference = ReferenceHint.FromText("Should I call John.");
Assert.Equal("Ligue para João?", new PortugueseConverter().Convert("Ligue para João?", reference: reference));
reference = ReferenceHint.FromText("Should I call John?");
Assert.Equal("Ligue para João?", new PortugueseConverter(new ConversionOptions(YouToTu: false))
.Convert("Ligue para João?", reference: reference));
Assert.Equal("Ligue para João?", new PortugueseConverter(new ConversionOptions(DisabledRules: "action-questions"))
.Convert("Ligue para João?", reference: reference));
Assert.Equal("Ligo para João?", new PortugueseConverter(new ConversionOptions(Pronouns: false))
.Convert("Ligue para João?", reference: reference));
Assert.Equal("É uma pequena parada.", new PortugueseConverter(new ConversionOptions(Vocabulary: false))
.Convert("É uma pequena parada.", reference: ReferenceHint.FromText("It's one little stop.")));
Assert.Equal("É uma pequena parada.", new PortugueseConverter(new ConversionOptions(DisabledRules: "travel-stops"))
.Convert("É uma pequena parada.", reference: ReferenceHint.FromText("It's one little stop.")));
var list = new PortugueseLocalWordList();
list.Ignored.Add("Ligue para João");
list.Ignored.Add("pequena parada");
Assert.Equal("Ligue para João?", new PortugueseConverter(localWordList: list)
.Convert("Ligue para João?", reference: reference));
Assert.Equal("É uma pequena parada.", new PortugueseConverter(localWordList: list)
.Convert("É uma pequena parada.", reference: ReferenceHint.FromText("It's one little stop.")));
}

[Theory]
[InlineData("E se precisar de ajuda.", 3010)]
[InlineData("E se precisar de ajuda...", 8000)]
[InlineData("Se ele precisar de ajuda...", 3010)]
public void BareQuestionNeedsABoundedSecondPersonConditional(string previous, long start)
{
var blocks = SubRipParser.Parse("1\n00:00:01,000 --> 00:00:03,000\n" + previous +
"\n\n2\n00:00:08,000 --> 00:00:10,000\nLigue para João?\n\n");
blocks[1].StartMs = start;
var english = previous.StartsWith("Se ele", StringComparison.Ordinal)
? "If he needs help..." : "And if you need help...";
var result = SubtitleConversion.Convert(blocks, new ConversionOptions(),
english: new string?[] { english, "Call John?" });
Assert.Equal("Ligue para João?", result[1].Text);
}

[Theory]
[InlineData("Vamos. É amiga do Paulo, Sra. Silva, certo?",
"Come on. It's Paul's friend, Mrs. Silva, all right?")]
[InlineData("É a minha vizinha, Sra. Silva.", "She's my neighbour, Mrs. Silva.")]
[InlineData("É o meu colega, Sr. Silva.", "He's my colleague, Mr. Silva.")]
public void NamedThirdPersonAppositionDoesNotImposeFormalRegister(string mention, string englishMention)
{
var blocks = SubRipParser.Parse("1\n00:00:01,000 --> 00:00:03,000\nVamos, João.\n\n" +
"2\n00:00:03,010 --> 00:00:06,000\nNão. Disse que\niria me deixar.\n\n" +
"3\n00:00:06,010 --> 00:00:09,000\n" + mention + "\n\n");
var result = SubtitleConversion.Convert(blocks, new ConversionOptions(),
english: new string?[] { "Come on, John.", "No. You said you were gonna drop me off.", englishMention });
Assert.False(result[1].Hint!.FormalAddress);
Assert.Equal("Não. Disseste que\nme ias deixar.", result[1].Text);
}

[Theory]
[InlineData("Sra. Silva, pode ajudar?", "Mrs. Silva, can you help?")]
[InlineData("É a minha amiga, senhora.", "She's my friend, ma'am.")]
[InlineData("É a minha amiga, Sra. Silva, pode ajudar?", "She's my friend, Mrs. Silva, can you help?")]
public void ActualFormalVocativesKeepRegister(string address, string englishAddress)
{
var blocks = SubRipParser.Parse("1\n00:00:01,000 --> 00:00:03,000\nNão. Disse que iria voltar.\n\n" +
"2\n00:00:03,010 --> 00:00:06,000\n" + address + "\n\n");
var result = SubtitleConversion.Convert(blocks, new ConversionOptions(),
english: new string?[] { "No. You said you were going to return.", englishAddress });
Assert.True(result[0].Hint!.FormalAddress);
Assert.Equal("Não. Disse que iria voltar.", result[0].Text);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
using SubtitleEdit.Plugins.BrazilianToEuropeanPortuguese;
using SubtitleEdit.Plugins.Shared;

namespace BrazilianToEuropeanPortuguese.Tests;

public sealed class DroppedSubjunctiveSubjectTests
{
[Theory]
[InlineData("Bem, talvez precise\ndo trabalho.", "Well, maybe you need the job.",
"Bem, talvez precises\ndo trabalho.")]
[InlineData("Talvez queira sair.", "Maybe you want to leave.", "Talvez queiras sair.")]
[InlineData("Talvez possa ajudar.", "Perhaps you can help.", "Talvez possas ajudar.")]
[InlineData("Bem, talvez tenha razão.", "Well, maybe you are right.", "Bem, talvez tenhas razão.")]
[InlineData("Talvez saiba.", "Maybe you know.", "Talvez saibas.")]
[InlineData("Talvez venha amanhã.", "Maybe you'll come tomorrow.", "Talvez venhas amanhã.")]
[InlineData("Talvez consiga resolver.", "Maybe you can solve it.", "Talvez consigas resolver.")]
[InlineData("Talvez encontre trabalho.", "Maybe you will find work.", "Talvez encontres trabalho.")]
[InlineData("Talvez não queira sair.", "Maybe you don't want to leave.", "Talvez não queiras sair.")]
[InlineData("E se precisar de um ombro\npara chorar...", "And if you ever need a shoulder to cry on...",
"E se precisares de um ombro\npara chorar...")]
[InlineData("Se precisar de ajuda.", "If you need help.", "Se precisares de ajuda.")]
[InlineData("E se precisar de ajuda?", "What if you need help?", "E se precisares de ajuda?")]
[InlineData("Mas se comprar uma casa.", "But if you buy a house.", "Mas se comprares uma casa.")]
[InlineData("Ou se encontrar trabalho.", "Or if you find work.", "Ou se encontrares trabalho.")]
[InlineData("E se conseguir entrar.", "And if you manage to enter.", "E se conseguires entrar.")]
[InlineData("Quando precisar de ajuda.", "When you need help.", "Quando precisares de ajuda.")]
[InlineData("Quando tiver tempo.", "When you have time.", "Quando tiveres tempo.")]
[InlineData("E se puder ajudar.", "And if you can help.", "E se puderes ajudar.")]
[InlineData("Se fizer isso.", "If you do that.", "Se fizeres isso.")]
[InlineData("Se disser isso.", "If you say that.", "Se disseres isso.")]
[InlineData("Quando vier.", "When you come.", "Quando vieres.")]
[InlineData("Quando atinge certa idade,\nfaz esse tipo de coisa.",
"When you reach a certain age, you do that sort of thing.",
"Quando atinges certa idade,\nfazes esse tipo de coisa.")]
[InlineData("Se precisar de ajuda, sabe onde estou.",
"If you need help, you know where I am.",
"Se precisares de ajuda, sabes onde estou.")]
[InlineData("Se souber.", "If you know.", "Se souberes.")]
[InlineData("A menos que precise de ajuda.", "Unless you need help.", "A menos que precises de ajuda.")]
[InlineData("Assim que terminar.", "As soon as you finish.", "Assim que terminares.")]
[InlineData("E se não precisar de ajuda.", "And if you don't need help.", "E se não precisares de ajuda.")]
[InlineData("<i>E se precisar de ajuda...</i>", "And if you need help...", "<i>E se precisares de ajuda...</i>")]
[InlineData("E SE PRECISAR DE AJUDA.", "And if you need help.", "E SE PRECISARES DE AJUDA.")]
public void ReferenceConfirmedDroppedSubjectsAgree(string source, string english, string expected)
{
var converter = new PortugueseConverter();
var reference = ReferenceHint.FromText(english);
Assert.Equal(expected, converter.Convert(source, reference: reference));
Assert.Equal(expected, converter.Convert(expected, reference: reference));
}

[Theory]
[InlineData("O trabalho não precisa\nmais de mim.", "The job doesn't need me anymore.",
"O trabalho não precisa\nmais de mim.")]
[InlineData("Bem, talvez precise\ndo trabalho.", "Well, maybe she needs the job.",
"Bem, talvez precise\ndo trabalho.")]
[InlineData("Talvez ele precise de ajuda.", "Maybe you should help him.", "Talvez ele precise de ajuda.")]
[InlineData("E se precisar de ajuda.", "And if she needs help.", "E se precisar de ajuda.")]
[InlineData("Se ele precisar de ajuda.", "If you help him.", "Se ele precisar de ajuda.")]
[InlineData("Se Maria comprar uma casa.", "If you help Maria buy a house.", "Se Maria comprar uma casa.")]
[InlineData("Quando o trabalho terminar.", "When you finish the job.", "Quando o trabalho terminar.")]
[InlineData("E se precisar de ajuda.", null, "E se precisar de ajuda.")]
[InlineData("Talvez precise de ajuda.", null, "Talvez precise de ajuda.")]
[InlineData("E se precisares de ajuda.", null, "E se precisares de ajuda.")]
[InlineData("E se precisarem de ajuda.", null, "E se precisarem de ajuda.")]
[InlineData("Se precisar de ajuda.", "If you and Maria need help.", "Se precisar de ajuda.")]
[InlineData("Ouça, não vai contar à minha mãe, certo?",
"You're not going to tell my mom, right?", "Ouça, não vai contar à minha mãe, certo?")]
public void DifferentAndUncertainSubjectsAreNotGuessed(string source, string? english, string expected) =>
Assert.Equal(expected, new PortugueseConverter().Convert(source, reference: ReferenceHint.FromText(english)));

[Theory]
[InlineData("E se precisar de ajuda.", "And if you need help.")]
[InlineData("Bem, talvez precise do trabalho.", "Well, maybe you need the job.")]
public void FormalAddressAndDisabledRulesStayProtected(string source, string english)
{
var reference = ReferenceHint.FromText(english)!;
Assert.Equal(source, new PortugueseConverter().Convert(source,
reference: reference with { FormalAddress = true }));
Assert.Equal(source, new PortugueseConverter(new ConversionOptions(YouToTu: false))
.Convert(source, reference: reference));
Assert.Equal(source, new PortugueseConverter(new ConversionOptions(DisabledRules: "address"))
.Convert(source, reference: reference));
}

[Fact]
public void ConditionalConjunctionIsPreservedWithPronounsDisabled() =>
Assert.Equal("E se precisares de ajuda.",
new PortugueseConverter(new ConversionOptions(Pronouns: false)).Convert("E se precisar de ajuda.",
reference: ReferenceHint.FromText("And if you need help.")));

[Fact]
public void IgnoredComplementsStayUntouched()
{
var words = new PortugueseLocalWordList();
words.Ignored.Add("se precisar de ajuda");
Assert.Equal("E se precisar de ajuda.", new PortugueseConverter(localWordList: words)
.Convert("E se precisar de ajuda.", reference: ReferenceHint.FromText("And if you need help.")));
}

[Theory]
[InlineData(false)]
[InlineData(true)]
public void SharedCuePipelinePreservesSubjectsAndTimes(bool sentenceContext)
{
var source = "689\n00:35:37,468 --> 00:35:40,486\nO trabalho não precisa\nmais de mim.\n\n" +
"690\n00:35:40,490 --> 00:35:43,642\nBem, talvez precise\ndo trabalho.\n\n" +
"693\n00:35:53,818 --> 00:35:58,204\nE se precisar de um ombro\npara chorar...\n\n";
var blocks = SubRipParser.Parse(source);
var result = SubtitleConversion.Convert(blocks, new ConversionOptions(SentenceContext: sentenceContext),
english: new string?[] { "The job doesn't need me anymore.", "Well, maybe you need the job.",
"And if you ever need a shoulder to cry on..." });
Assert.Equal("O trabalho não precisa\nmais de mim.", result[0].Text);
Assert.Equal("Bem, talvez precises\ndo trabalho.", result[1].Text);
Assert.Equal("E se precisares de um ombro\npara chorar...", result[2].Text);
Assert.Equal(3, result.Count);
Assert.Equal(2153818L, blocks[2].StartMs);
Assert.Equal(2158204L, blocks[2].EndMs);
}
}
Loading
Loading