package pl.edu.amu.wmi.daut.base;
import java.util.Set;
import java.util.HashSet;
import java.util.List;
import junit.framework.TestCase;
/**
*
* @author Adam
*
* klasa testuje poprawność działania metody
* public void createAutomatonForFiniteLanguage
* (DeterministicAutomatonSpecification automaton, Set<String> language)
* w klasie DeterministicUtilities.
*/
public class TestDeterministicUtilities extends TestCase {
/**
* Testuje automat dla języka pustego.
*/
public final void testEmptyLanguage() {
Set<String> language1 = new HashSet<String>();
DeterministicAutomatonSpecification automaton1 =
new NaiveDeterministicAutomatonSpecification();
DeterministicUtilities detUtil = new DeterministicUtilities();
detUtil.createAutomatonForFiniteLanguage(automaton1, language1);
Generator words1 = new Generator();
List<String> accepted1 = words1.wordsFromAutomatonWithoutCycles(automaton1, "abc");
assertTrue(compare(language1, accepted1));
}
/**
* Testuje automat dla języka z tylko słowem pustym.
*/
public final void testEmptyWord() {
Set<String> language2 = new HashSet<String>();
language2.add("");
DeterministicAutomatonSpecification automaton2 =
new NaiveDeterministicAutomatonSpecification();
DeterministicUtilities detUtil = new DeterministicUtilities();
detUtil.createAutomatonForFiniteLanguage(automaton2, language2);
AutomatonByRecursion angle = new AutomatonByRecursion(automaton2);
assertTrue(angle.accepts(""));
assertFalse(angle.accepts("cokolwiek_niepustego"));
/*
Generator words2 = new Generator();
List<String> accepted2 = words2.wordsFromAutomatonWithoutCycles(automaton2, "abc");
assertTrue(compare(language2, accepted2));*/
}
/**
* Test Przykładowy.
*/
public final void testNormal() {
Set<String> language3 = new HashSet<String>();
language3.add("ko");
language3.add("kot");
language3.add("kok");
language3.add("kat");
language3.add("");
language3.add("ko");
language3.add("k");
language3.add("tak");
language3.add("takmakptak");
language3.add("ak");
language3.add("bokot");
language3.add("boko");
language3.add("koty");
language3.add("kok");
language3.add("tyt");
language3.add("kotokokoojhooo");
language3.add("b");
language3.add("bok");
language3.add("bokot");
DeterministicAutomatonSpecification automaton3 =
new NaiveDeterministicAutomatonSpecification();
DeterministicUtilities detUtil = new DeterministicUtilities();
detUtil.createAutomatonForFiniteLanguage(automaton3, language3);
Generator words3 = new Generator();
List<String> accepted3 = words3.wordsFromAutomatonWithoutCycles(automaton3,
"qwertyuiopasdfghjklzxcvbnm");
assertTrue(compare(language3, accepted3));
AutomatonByRecursion angle = new AutomatonByRecursion(automaton3);
assertTrue(angle.accepts(""));
assertFalse(angle.accepts("cokolwiek_niepustego_i_nie_z_language"));
}
/**
* Test przykładowy ze słowem pustym.
*/
public final void testNormalAndEmptyWord() {
Set<String> language4 = new HashSet<String>();
language4.add("");
language4.add("kot");
language4.add("koty");
language4.add("kok");
language4.add("kotokokoojhooo");
language4.add("bok");
language4.add("bokot");
DeterministicAutomatonSpecification automaton4 =
new NaiveDeterministicAutomatonSpecification();
DeterministicUtilities detUtil = new DeterministicUtilities();
detUtil.createAutomatonForFiniteLanguage(automaton4, language4);
Generator words4 = new Generator();
List<String> accepted4 = words4.wordsFromAutomatonWithoutCycles(automaton4, "kotyjhb");
assertTrue(compare(language4, accepted4));
AutomatonByRecursion angle = new AutomatonByRecursion(automaton4);
assertTrue(angle.accepts(""));
assertFalse(angle.accepts("cokolwiek_niepustego_i_nie_z_language"));
}
/**
* Metoda porównująca słowa akceptowane przez powstały automat ze słowami oczekiwanymi.
*/
private boolean compare(Set<String> language, List<String> acceptedWords) {
int number = acceptedWords.size();
for (String i : language) {
if (i.equals("")) {
language.remove(i);
break;
}
}
if (language.size() == number) {
for (String i : language) {
for (String j : acceptedWords) {
if (i.equals(j)) {
number--;
//language.remove(i);
//acceptedWords.remove(j);
break;
}
}
}
//if (language.isEmpty() && acceptedWords.isEmpty()) {
return (number == 0);
} else {
return false;
}
}
}