package org.robotframework.javalib.factory;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import org.jmock.Mock;
import org.jmock.MockObjectTestCase;
import org.robotframework.javalib.beans.annotation.IKeywordExtractor;
import org.robotframework.javalib.keyword.DocumentedKeyword;
public class AnnotationKeywordFactoryTest extends MockObjectTestCase {
private Object someKeywordBean = new Object();
private Object anotherKeywordBean = new Object();
private Object keyword1 = mock(DocumentedKeyword.class).proxy();
private Object keyword2 = mock(DocumentedKeyword.class).proxy();
private String[] expectedKeywordNames = new String[] { "keywordname1", "keywordname2", "keywordname3", "keywordname4" };
private KeywordFactory<DocumentedKeyword> keywordFactory;
private Mock keywordExtractor;
private Map keywordBeans = new HashMap() {
@Override
public Collection values() {
return new HashSet() {{ add(someKeywordBean); add(anotherKeywordBean); }};
}
};
@Override
protected void setUp() throws Exception {
keywordExtractor = mock(IKeywordExtractor.class);
keywordExtractor.expects(once()).method("extractKeywords")
.with(eq(someKeywordBean))
.will(returnValue(new HashMap() {{
put("keywordname1", keyword1);
put("keywordname2", keyword2);
}}));
keywordExtractor.expects(once()).method("extractKeywords")
.with(eq(anotherKeywordBean))
.will(returnValue(new HashMap() {{
put("keywordname3", null);
put("keywordname4", null);
}}));
keywordFactory = new AnnotationKeywordFactory(keywordBeans) {
@Override
IKeywordExtractor createKeywordExtractor() {
return (IKeywordExtractor) keywordExtractor.proxy();
}
};
}
public void testExtractsKeywordNamesFromKeywordBeans() throws Exception {
assertArraysHaveSameContent(expectedKeywordNames, keywordFactory.getKeywordNames());
}
public void testExtractsKeywordsFromKeywordBeansWithNormalizedName() throws Exception {
String keywordName1 = "Keyword Name 1";
String keywordName2 = "KEYWORD_NAME_2";
assertEquals(keyword1, keywordFactory.createKeyword(keywordName1));
assertEquals(keyword2, keywordFactory.createKeyword(keywordName2));
}
private void assertArraysHaveSameContent(String[] expected, String[] actual) {
assertEquals(new HashSet(Arrays.asList(expected)), new HashSet(Arrays.asList(actual)));
}
}