Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ public void AttentionDistanceUsesItsAlignedEnglishTarget(string input, string? e
[InlineData("Ele esqueceu, talvez.", "Ele esqueceu-se, talvez.")]
[InlineData("Talvez porque ele sabe.", "Talvez porque ele sabe.")]
[InlineData("Talvez parte disso seja verdade.", "Talvez parte disso seja verdade.")]
[InlineData("Espero que ele tenha esquecido o nome.", "Espero que ele tenha esquecido o nome.")]
[InlineData("Espero que ele tenha esquecido o nome.", "Espero que ele se tenha esquecido do nome.")]
[InlineData("Espero que você não tenha esquecido de mim.", "Espero que não te tenhas esquecido de mim.")]
[InlineData("É possível que ele tenha-lhe mentido.", "É possível que ele lhe tenha mentido.")]
public void MaybeBeforeTheVerbTakesTheSubjunctive(string input, string expected)
Expand Down Expand Up @@ -333,7 +333,7 @@ public void MatchPeriodsUsePortugueseNames(string input, string english, string
[InlineData("Eu tinha esquecido do nome dela.", "Eu tinha-me esquecido do nome dela.")]
[InlineData("Você tinha esquecido de mim?", "Tinhas-te esquecido de mim?")]
[InlineData("Ela teria esquecido de tudo.", "Ela ter-se-ia esquecido de tudo.")]
[InlineData("Ele tinha esquecido o nome.", "Ele tinha esquecido o nome.")]
[InlineData("Ele tinha esquecido o nome.", "Ele tinha-se esquecido do nome.")]
[InlineData("Achei que ele tinha esquecido de mim.", "Achei que ele se tinha esquecido de mim.")]
[InlineData("O que ele tinha esquecido?", "O que ele tinha esquecido?")]
[InlineData("Eles tinham esquecido de trancar a porta.", "Eles tinham-se esquecido de trancar a porta.")]
Expand Down Expand Up @@ -418,7 +418,7 @@ public void BlueBloodsLeftoversUseEuropeanConstructions(string input, string exp
[InlineData("És bom e ganha sempre.", "És bom e ganhas sempre.")]
[InlineData("Só não ferva minhas bolas de novo.", "Só não fervas as minhas bolas de novo.")]
[InlineData("Não toque minhas bolas.", "Não toques nas minhas bolas.")]
[InlineData("Não toque a minha mão.", "Não toques na minha mão.")]
[InlineData("Não toque a minha mão.", "Não me toques na mão.")]
[InlineData("Ele tocou sua música.", "Ele tocou a sua música.")]
[InlineData("Não corte a corda.", "Não cortes a corda.")]
[InlineData("O corte foi fundo.", "O corte foi fundo.")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,6 @@ public void IdiomsNeedBothPortugueseConstructionAndEnglishEvidence(string source

[Theory]
[InlineData("Pode confiar em mim.")]
[InlineData("Esqueci o nome.")]
[InlineData("Ele lembra o pai.")]
[InlineData("Vira à esquerda.")]
[InlineData("Ele virou a página.")]
Expand Down
195 changes: 195 additions & 0 deletions se5/BrazilianToEuropeanPortuguese.Tests/ContextualComplementsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
using System.Text.RegularExpressions;
using SubtitleEdit.Plugins.BrazilianToEuropeanPortuguese;
using SubtitleEdit.Plugins.Shared;

namespace BrazilianToEuropeanPortuguese.Tests;

public sealed class ContextualComplementsTests
{
[Theory]
[InlineData("Bem, parece o juiz caiu do telhado.", "Bem, parece que o juiz caiu do telhado.")]
[InlineData("Parece ela chegou.", "Parece que ela chegou.")]
[InlineData("Parecia os agentes chegaram.", "Parecia que os agentes chegaram.")]
[InlineData("Pareceu a testemunha mentiu.", "Pareceu que a testemunha mentiu.")]
[InlineData("Parece-me o juiz caiu.", "Parece-me que o juiz caiu.")]
[InlineData("Não parece a testemunha mentiu.", "Não parece que a testemunha mentiu.")]
[InlineData("Parece a minha nova equipa não se opõe.", "Parece que a minha nova equipa não se opõe.")]
[InlineData("Parece o presidente da câmara caiu.", "Parece que o presidente da câmara caiu.")]
[InlineData("Parece ela o viu.", "Parece que ela o viu.")]
[InlineData("Parecerá o juiz foi enganado.", "Parecerá que o juiz foi enganado.")]
[InlineData("Pareceria o juiz tinha razão.", "Pareceria que o juiz tinha razão.")]
[InlineData("Não parece a testemunha disse tudo.", "Não parece que a testemunha disse tudo.")]
[InlineData("Parece ela chegou e parece ele saiu.", "Parece que ela chegou e parece que ele saiu.")]
[InlineData("PARECE ELA CHEGOU.", "PARECE QUE ELA CHEGOU.")]
[InlineData("<i>Parece ela chegou.</i>", "<i>Parece que ela chegou.</i>")]
public void FiniteComplementsRecoverQueAndRemainStable(string source, string expected)
{
var converter = new PortugueseConverter(new ConversionOptions(YouToTu: false));
var result = converter.Convert(source);
Assert.Equal(expected, result);
Assert.Equal(result, converter.Convert(result));
for (var i = 0; i < source.Length; i++)
{
if (source[i] != ' ') continue;
foreach (var newline in new[] { "\n", "\r\n" })
{
var wrapped = converter.Convert(source[..i] + newline + source[(i + 1)..]);
Assert.Equal(expected, Regex.Replace(wrapped, @"\s+", " "));
Assert.Equal(1, wrapped.Count(c => c == '\n'));
}
}
}

[Theory]
[InlineData("Bem, parece o juiz.")]
[InlineData("Parece o juiz que caiu.")]
[InlineData("Parece o juiz reformado.")]
[InlineData("Parece a minha mãe.")]
[InlineData("Parece uma testemunha credível.")]
[InlineData("Parece um dia lento no escritório.")]
[InlineData("O juiz parece estar cansado.")]
[InlineData("Parece ter caído.")]
[InlineData("Parece que o juiz caiu.")]
[InlineData("Parece ela chegar.")]
[InlineData("Parece o juiz e o advogado.")]
[InlineData("Parece o juiz do caso.")]
[InlineData("Parece o que aconteceu.")]
[InlineData("Parece a minha mãe quando era jovem.")]
[InlineData("Parece o homem com quem ela falou.")]
[InlineData("Parece\n\nela chegou.")]
[InlineData("- Parece\n- ela chegou.")]
[InlineData("Parece um rapaz seguro.")]
[InlineData("Parece um homem livre.")]
[InlineData("Parece um homem são.")]
[InlineData("-Parece o juiz.\n-Caiu do telhado.")]
public void ResemblanceInfinitivesRelativesAndDifferentSpeakersAreProtected(string source) =>
Assert.Equal(source, new PortugueseConverter(new ConversionOptions(YouToTu: false)).Convert(source));

[Fact]
public void SplitFiniteComplementsUseOnlyARecentSelectedSameSpeakerContinuation()
{
var blocks = new[] {
new SrtBlock { StartMs = 297064, EndMs = 299887, Text = "Bem, parece o Juiz" },
new SrtBlock { StartMs = 299900, EndMs = 302191, Text = "caiu de cabeça\ndo telhado." },
};
var options = new ConversionOptions(YouToTu: false);
var result = SubtitleConversion.Convert(blocks, options);
Assert.Equal("Bem, parece que o Juiz", result[0].Text);
Assert.Equal("caiu de cabeça\ndo telhado.", result[1].Text);
Assert.Equal("Bem, parece o Juiz", SubtitleConversion.Convert(blocks, options, selected: new HashSet<int> { 0 })[0].Text);
Assert.Equal("Bem, parece o Juiz", SubtitleConversion.Convert(blocks, options, speakers: new[] { "A", "B" })[0].Text);
blocks[1].StartMs = 310000;
Assert.Equal("Bem, parece o Juiz", SubtitleConversion.Convert(blocks, options)[0].Text);
Assert.Equal("Bem, parece o Juiz", blocks[0].Text);
Assert.Equal(299887, blocks[0].EndMs);
}

[Theory]
[InlineData("Ela está aqui.", "Mande entrar.", "Mande-a entrar.")]
[InlineData("Ele está aqui.", "Mande entrar.", "Mande-o entrar.")]
[InlineData("Elas estão aqui.", "Mande entrar.", "Mande-as entrar.")]
[InlineData("Eles estão aqui.", "Mande entrar.", "Mande-os entrar.")]
[InlineData("Ela chegou.", "Deixe entrar.", "Deixe-a entrar.")]
[InlineData("Ela está à espera.", "Mande subir.", "Mande-a subir.")]
[InlineData("Ela está aqui.", "Não mande entrar.", "Não a mande entrar.")]
[InlineData("ELA ESTÁ AQUI.", "MANDE ENTRAR.", "MANDE-A ENTRAR.")]
[InlineData("Ela está aqui.", "<i>Mande entrar.</i>", "<i>Mande-a entrar.</i>")]
public void ExplicitArrivalReferentsControlGenderAndNumberWithoutChangingCommandPerson(
string previous, string command, string expected)
{
var blocks = Pair(previous, command);
var options = new ConversionOptions(Address: AddressMode.Formal);
var result = SubtitleConversion.Convert(blocks, options);
Assert.Equal(expected, result[1].Text);
blocks[1].Text = result[1].Text;
Assert.Equal(expected, SubtitleConversion.Convert(blocks, options)[1].Text);
}

[Theory]
[InlineData("Ela está aqui.", "Mande entrar.", "Let her in.", "Mande-a entrar.")]
[InlineData("Ela está aqui.", "Mande entrar.", "Let's have her.", "Mande-a entrar.")]
[InlineData("Ela está aqui.", "Mande entrar.", "Send him in.", "Mande entrar.")]
[InlineData("Ela está aqui.", "Mande entrar.", "Send her and him in.", "Mande entrar.")]
[InlineData("Ela está aqui.", "Mande entrar.", "Let her out.", "Mande entrar.")]
[InlineData("Ela está aqui.", "Mande entrar.", "Send money in.", "Mande entrar.")]
[InlineData("Ela está aqui.", "Mande entrar.", "Her father is coming.", "Mande entrar.")]
[InlineData("Ela está aqui.", "Não mande entrar.", "Don't let her in.", "Não a mande entrar.")]
[InlineData("Ela está aqui.", "Mande entrar.", "Don't let her in.", "Mande entrar.")]
[InlineData("Ela está aqui.", "Não mande entrar.", "Let her in.", "Não mande entrar.")]
[InlineData("Ela está aqui, com ele.", "Mande entrar.", "Send her in.", "Mande entrar.")]
[InlineData("Ela não está aqui.", "Mande entrar.", "Send her in.", "Mande entrar.")]
[InlineData("Ele disse que ela está aqui.", "Mande entrar.", "Send her in.", "Mande entrar.")]
[InlineData("Ela está aqui.", "Mande o agente entrar.", "Send him in.", "Mande o agente entrar.")]
[InlineData("Ela está aqui.", "Mande-a entrar.", "Send her in.", "Mande-a entrar.")]
[InlineData("Ela está aqui.", "Mande entrar o agente.", "Send him in.", "Mande entrar o agente.")]
[InlineData("Ela está aqui.", "Mande entrar dinheiro.", "Send money in.", "Mande entrar dinheiro.")]
public void ConflictsMultipleReferentsAndExpressedObjectsAreProtected(
string previous, string command, string english, string expected) =>
Assert.Equal(expected, SubtitleConversion.Convert(Pair(previous, command),
new ConversionOptions(Address: AddressMode.Formal), english: new string?[] { null, english })[1].Text);

[Fact]
public void ContextRecoveryRespectsSettingsSelectionAndLocalOverrides()
{
var blocks = Pair("Ela está aqui.", "Mande entrar.");
var options = new ConversionOptions(Address: AddressMode.Formal);
foreach (var disabled in new[] { options with { Pronouns = false }, options with { DisabledRules = "arrival-object" } })
Assert.Equal("Mande entrar.", SubtitleConversion.Convert(blocks, disabled)[1].Text);
Assert.Equal("Mande entrar.", SubtitleConversion.Convert(blocks, options, selected: new HashSet<int> { 1 })[1].Text);
Assert.Equal("Manda-a entrar.", SubtitleConversion.Convert(blocks, options with { Address = AddressMode.Informal })[1].Text);
blocks[1].StartMs = 10000;
Assert.Equal("Mande entrar.", SubtitleConversion.Convert(blocks, options)[1].Text);
var words = new PortugueseLocalWordList();
words.Ignored.Add("Mande entrar");
Assert.Equal("Mande entrar.", SubtitleConversion.Convert(Pair("Ela está aqui.", "Mande entrar."), options, words)[1].Text);
foreach (var disabled in new[] { new ConversionOptions(Colloquial: false),
new ConversionOptions(DisabledRules: "parecer-complement") })
Assert.Equal("Parece ela chegou.", new PortugueseConverter(disabled).Convert("Parece ela chegou."));
words.Ignored.Clear();
words.Ignored.Add("parece");
Assert.Equal("Parece ela chegou.", new PortugueseConverter(localWordList: words).Convert("Parece ela chegou."));
words.Ignored.Clear();
words.Words.Add(("parece", "aparenta"));
Assert.Equal("Aparenta ela chegou.", new PortugueseConverter(localWordList: words).Convert("Parece ela chegou."));
words.Words.Clear();
words.Words.Add(("mande", "peça"));
Assert.Equal("Peça entrar.", SubtitleConversion.Convert(Pair("Ela está aqui.", "Mande entrar."), options, words)[1].Text);
}

[Theory]
[InlineData("Mande", "entrar", "Mande-a entrar.")]
[InlineData("Mandem", "sair", "Mandem-na sair.")]
[InlineData("Deixem", "passar", "Deixem-na passar.")]
[InlineData("Deixe", "esperar", "Deixe-a esperar.")]
[InlineData("Mande", "descer", "Mande-a descer.")]
public void CommandsPreserveWrappingSoundChangesAndReviewNotes(string verb, string infinitive, string expected)
{
foreach (var newline in new[] { " ", "\n", "\r\n" })
{
var blocks = Pair("Ela está" + newline + "aqui.", verb + newline + infinitive + ".");
var result = SubtitleConversion.Convert(blocks, new ConversionOptions(Address: AddressMode.Formal));
Assert.Equal(expected, Regex.Replace(result[1].Text, @"\s+", " "));
Assert.Equal(newline.Count(c => c == '\n'), result[1].Text.Count(c => c == '\n'));
Assert.Contains("referent", result[1].ContextNote);
}
}

[Theory]
[InlineData("caiu.", "Parece que o juiz")]
[InlineData("não caiu.", "Parece que o juiz")]
[InlineData("se opõe.", "Parece que o juiz")]
[InlineData("-Caiu.", "Parece o juiz")]
[InlineData("parece cansado.", "Parece o juiz")]
public void ContinuationsRequireACompleteSubjectInTheOriginalCue(string next, string expected)
{
var blocks = Pair("Parece o juiz", next);
blocks[1].StartMs = 2500;
Assert.Equal(expected, SubtitleConversion.Convert(blocks, new ConversionOptions(YouToTu: false))[0].Text);
}

private static SrtBlock[] Pair(string previous, string command) =>
[
new SrtBlock { StartMs = 1000, EndMs = 2400, Text = previous },
new SrtBlock { StartMs = 4000, EndMs = 5500, Text = command },
];
}
29 changes: 24 additions & 5 deletions se5/BrazilianToEuropeanPortuguese.Tests/ConverterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@
[InlineData("Vou contar-te uma parada.", "Vou contar-te uma coisa.")]
[InlineData("Vou-te contar uma parada.", "Vou-te contar uma coisa.")]
[InlineData("Mas vou contar uma parada.", "Mas vou contar uma coisa.")]
[InlineData("Não vou te contar uma parada.", "Não vou contar-te uma coisa.")]
[InlineData("Não vou te contar uma parada.", "Não te vou contar uma coisa.")]
[InlineData("Contar-lhe uma parada.", "Contar-lhe uma coisa.")]
public void TellThingComposesWithCliticPlacement(string source, string expected) => AssertConverts(source, expected);

Expand Down Expand Up @@ -708,7 +708,7 @@
[InlineData("Um bar de topless.", "Um bar de topless.")]
[InlineData("O policial Olivet está aqui para vê-lo.", "O agente Olivet está aqui para vê-lo.")]
[InlineData("Sabia sobre isso?", "Sabia disto?")]
[InlineData("Mande entrar.", "Mando-o entrar.")]
[InlineData("Mande entrar.", "Manda entrar.")]
[InlineData("Nossa foto de casamento?", "A nossa foto de casamento?")]
[InlineData("E ocupando nossa cadeira muito brevemente.", "E ocupando a nossa cadeira muito brevemente.")]
[InlineData("Nossa, que lindo!", "Caramba, que lindo!")]
Expand Down Expand Up @@ -739,7 +739,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 742 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 @@ -859,7 +859,7 @@
[InlineData("Já lhe mandei suas coisas.", "Já lhe mandei as suas coisas.")]
[InlineData("Já lhes entreguei seus livros.", "Já lhes entreguei os seus livros.")]
[InlineData("Preciso do seu contato.", "Preciso do teu contacto.")]
[InlineData("Você esqueceu suas coisas.", "Esqueceste as tuas coisas.")]
[InlineData("Você esqueceu suas coisas.", "Esqueceste-te das tuas coisas.")]
public void CueLevelPossessiveContext(string br, string pt) => AssertConverts(br, pt);

[Theory]
Expand All @@ -878,7 +878,14 @@
const string text = "Já mandei suas roupas.";
Assert.Equal("Já mandei as suas roupas.", Converter.Convert(text, "E me divorciando do cretino."));
Assert.Equal("Já mandei as tuas roupas.", Converter.Convert(text));
Assert.Equal("Esqueceste as tuas coisas.", Converter.Convert("Você esqueceu suas coisas.", "E me divorciando do cretino."));
Assert.Equal("Esqueceste-te das tuas coisas.", Converter.Convert("Você esqueceu suas coisas.", "E me divorciando do cretino."));
}

[Fact]
public void ReferenceGuidedForgottenPossessiveUsesPronominalConstruction()
{
var result = Converter.Convert("Esqueceu seu café.", reference: ReferenceHint.FromText("You forgot your coffee."));
Assert.Equal("Esqueceste-te do teu café.", result);
}

[Theory]
Expand Down Expand Up @@ -1781,6 +1788,17 @@
[InlineData("Nós lembramos de tudo.", "Nós lembramo-nos de tudo.")]
[InlineData("Ela não lembrava do rosto.", "Ela não se lembrava do rosto.")]
[InlineData("Ele esqueceu da reunião.", "Ele esqueceu-se da reunião.")]
[InlineData("Você esqueceu seu café.", "Esqueceste-te do teu café.")]
[InlineData("Esqueci a chave.", "Esqueci-me da chave.")]
[InlineData("Esqueci os documentos.", "Esqueci-me dos documentos.")]
[InlineData("Esqueci isto.", "Esqueci-me disto.")]
[InlineData("Esqueci tudo.", "Esqueci-me de tudo.")]
[InlineData("Você tinha esquecido o nome.", "Tinhas-te esquecido do nome.")]
[InlineData("Nós tínhamos esquecido o nome.", "Nós tínhamo-nos esquecido do nome.")]
[InlineData("Ela teria esquecido o nome.", "Ela ter-se-ia esquecido do nome.")]
[InlineData("Eu não tinha esquecido o nome.", "Eu não me tinha esquecido do nome.")]
[InlineData("Não esquece o café.", "Não te esqueças do café.")]
[InlineData("Ele esquece o passado.", "Ele esquece-se do passado.")]
[InlineData("Você esqueceu de mim?", "Esqueceste-te de mim?")]
[InlineData("Não esquece de mim.", "Não te esqueças de mim.")]
[InlineData("Não esqueça de ligar.", "Não te esqueças de ligar.")]
Expand All @@ -1791,7 +1809,8 @@
[InlineData("Na verdade, nem me\nlembro dessa conversa.", "Na verdade, nem me\nlembro dessa conversa.")]
[InlineData("Não me lembro de nada.", "Não me lembro de nada.")]
[InlineData("Isso lembra o meu pai.", "Isso lembra o meu pai.")]
[InlineData("Esqueci o nome dele.", "Esqueci o nome dele.")]
[InlineData("Esqueci o nome dele.", "Esqueci-me do nome dele.")]
[InlineData("Esquece o passado.", "Esquece o passado.")]
[InlineData("Esquece isso.", "Esquece isso.")]
[InlineData("Esquece!", "Esquece!")]
[InlineData("Tudo o que lembro.", "Tudo o que me lembro.")]
Expand Down
Loading
Loading