/** * Copyright (C) 2012 cogroo <cogroo@cogroo.org> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.cogroo.tools.checker.checkers; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import opennlp.tools.util.Span; import org.cogroo.entities.Mistake; import org.cogroo.entities.Sentence; import org.cogroo.entities.Token; import org.cogroo.entities.impl.MorphologicalTag; import org.cogroo.entities.impl.TokenCogroo; import org.junit.Test; import org.cogroo.tools.checker.rules.model.TagMask.Class; /** * * Tests for {@link RepetitionChecker}. * */ public class RepetitionCheckerTest { private Sentence createSentence(String text, Class... classes) { Sentence sentence = new Sentence(); sentence.setOffset(0); sentence.setSpan(new Span(0, text.length())); List<Token> tokens = new ArrayList<Token>(); String[] words = text.split(" "); if (words.length != classes.length) throw new IllegalArgumentException( "Number of tokens doesn't match the number of tags"); int index = 0; for (int i = 0; i < words.length; i++) { MorphologicalTag tag = new MorphologicalTag(); tag.setClazz(classes[i]); Token token = new TokenCogroo(words[i], index); token.setMorphologicalTag(tag); tokens.add(token); index = index + words[i].length() + 1; } sentence.setTokens(tokens); return sentence; } @Test public void testCorrectWordSe() { Sentence sentence = createSentence("Se se morre de amor .", Class.SUBORDINATING_CONJUNCTION, Class.PERSONAL_PRONOUN, Class.FINITIVE_VERB, Class.PREPOSITION, Class.NOUN, Class.PUNCTUATION_MARK); RepetitionChecker checker = new RepetitionChecker(); List<Mistake> errors = checker.check(sentence); assertEquals(0, errors.size()); } @Test public void testPronounRepetition() { String error = "Ele ele se foi ."; StringBuilder strBuilder = new StringBuilder(error); Sentence sentence = createSentence(error, Class.PERSONAL_PRONOUN, Class.PERSONAL_PRONOUN, Class.PERSONAL_PRONOUN, Class.FINITIVE_VERB, Class.PUNCTUATION_MARK); RepetitionChecker checker = new RepetitionChecker(); List<Mistake> errors = checker.check(sentence); assertEquals(1, errors.size()); Mistake mistake = errors.get(0); strBuilder.replace(mistake.getStart(),mistake.getEnd(), mistake.getSuggestions()[0]); assertEquals("Ele se foi .", strBuilder.toString()); } @Test public void testRuleDetails() { String error = "Ele ele se foi ."; StringBuilder strBuilder = new StringBuilder(error); Sentence sentence = createSentence(error, Class.PERSONAL_PRONOUN, Class.PERSONAL_PRONOUN, Class.PERSONAL_PRONOUN, Class.FINITIVE_VERB, Class.PUNCTUATION_MARK); RepetitionChecker checker = new RepetitionChecker(); List<Mistake> errors = checker.check(sentence); assertEquals(1, errors.size()); Mistake mistake = errors.get(0); assertEquals(RepetitionChecker.ID, mistake.getRuleIdentifier()); assertTrue(mistake.getFullMessage().contains(RepetitionChecker.MESSAGE)); assertEquals(RepetitionChecker.SHORT, mistake.getShortMessage()); assertNotNull(mistake.getSuggestions()); strBuilder.replace(mistake.getStart(),mistake.getEnd(), mistake.getSuggestions()[0]); assertEquals("Ele se foi .", strBuilder.toString()); } @Test public void testAllRepetition() { Sentence sentence = createSentence( "Ela ela se se portava portava calmamente calmamente por por lá lá .", Class.PERSONAL_PRONOUN, Class.PERSONAL_PRONOUN, Class.PERSONAL_PRONOUN, Class.PERSONAL_PRONOUN, Class.FINITIVE_VERB, Class.FINITIVE_VERB, Class.ADVERB, Class.ADVERB, Class.PREPOSITION, Class.PREPOSITION, Class.ADVERB, Class.ADVERB, Class.PUNCTUATION_MARK); RepetitionChecker checker = new RepetitionChecker(); List<Mistake> errors = checker.check(sentence); assertEquals(6, errors.size()); } @Test public void testGraveAccent() { Sentence sentence = createSentence( "Caminhava a a tarde toda .", Class.FINITIVE_VERB, Class.PREPOSITION, Class.ARTICLE, Class.ADVERB, Class.ADVERB, Class.PUNCTUATION_MARK); RepetitionChecker checker = new RepetitionChecker(); List<Mistake> errors = checker.check(sentence); assertEquals(0, errors.size()); } @Test public void testNumber() { Sentence sentence = createSentence( "Dia 11 .", Class.NOUN, Class.NUMERAL, Class.PUNCTUATION_MARK); RepetitionChecker checker = new RepetitionChecker(); List<Mistake> errors = checker.check(sentence); assertEquals(0, errors.size()); } }