/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.frontend.analyser;
import static abs.frontend.analyser.ErrorMessage.CYCLIC_INHERITANCE;
import static abs.frontend.analyser.ErrorMessage.UNKOWN_INTERFACE;
import static org.junit.Assert.*;
import java.util.Iterator;
import org.junit.Test;
import abs.frontend.FrontendTest;
import abs.frontend.ast.Model;
public class InterfaceDeclarationTest extends FrontendTest {
@Test
public void trivial() {
Model p = assertParseOk("interface I {} {}");
assertTrue(!p.getErrors().containsErrors());
}
@Test
public void extending() {
Model p = assertParseOk("interface I {} interface J extends I {} {}");
assertTrue(!p.getErrors().containsErrors());
}
@Test
public void extendingReversed() {
Model p = assertParseOk("interface J extends I {} interface I {} {}");
assertTrue(!p.getErrors().containsErrors());
}
@Test
public void extendingUndefined() {
Model p = assertParseOk("interface J extends I {} {}");
assertEquals(1,p.getErrors().getErrorCount());
assertEndsWith(p.getErrors().getFirstError(), UNKOWN_INTERFACE.withArgs("I"));
}
@Test
public void circular() {
Model p = assertParseOk("interface I extends I {} {}");
assertEquals(1,p.getErrors().getErrorCount());
assertEndsWith(p.getErrors().getFirstError(), CYCLIC_INHERITANCE.withArgs("I"));
}
@Test
public void mutuallyCircular() {
Model p = assertParseOk("interface I extends J {} interface J extends I {} {}");
assertEquals(2,p.getErrors().getErrorCount());
Iterator<SemanticCondition> i = p.getErrors().iterator();
assertEndsWith(i.next(), CYCLIC_INHERITANCE.withArgs("I"));
assertEndsWith(i.next(), CYCLIC_INHERITANCE.withArgs("J"));
}
@Test
public void mutuallyCircularIndirect() {
Model p = assertParseOk("interface I extends J {} interface J extends K {} interface K extends I {}");
assertEquals(3,p.getErrors().getErrorCount());
Iterator<SemanticCondition> i = p.getErrors().iterator();
assertEndsWith(i.next(), CYCLIC_INHERITANCE.withArgs("I"));
assertEndsWith(i.next(), CYCLIC_INHERITANCE.withArgs("J"));
assertEndsWith(i.next(), CYCLIC_INHERITANCE.withArgs("K"));
}
private void assertEndsWith(SemanticCondition expected, String actual) {
assertTrue("Expected that " + expected.getHelpMessage() + " ends with " + actual, expected.getHelpMessage()
.endsWith(actual));
}
}