зеркало из https://github.com/mozilla/gecko-dev.git
217 строки
5.8 KiB
Python
217 строки
5.8 KiB
Python
# Import the WebIDL module, so we can do isinstance checks and whatnot
|
|
import WebIDL
|
|
|
|
def WebIDLTest(parser, harness):
|
|
# Basic functionality
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
A implements B;
|
|
interface B {
|
|
attribute long x;
|
|
};
|
|
interface A {
|
|
attribute long y;
|
|
};
|
|
""")
|
|
results = parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(not threw, "Should not have thrown on implements statement "
|
|
"before interfaces")
|
|
harness.check(len(results), 3, "We have three statements")
|
|
harness.ok(isinstance(results[1], WebIDL.IDLInterface), "B is an interface")
|
|
harness.check(len(results[1].members), 1, "B has one member")
|
|
A = results[2]
|
|
harness.ok(isinstance(A, WebIDL.IDLInterface), "A is an interface")
|
|
harness.check(len(A.members), 2, "A has two members")
|
|
harness.check(A.members[0].identifier.name, "y", "First member is 'y'")
|
|
harness.check(A.members[1].identifier.name, "x", "Second member is 'x'")
|
|
|
|
# Duplicated member names not allowed
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
C implements D;
|
|
interface D {
|
|
attribute long x;
|
|
};
|
|
interface C {
|
|
attribute long x;
|
|
};
|
|
""")
|
|
parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Should have thrown on implemented interface duplicating "
|
|
"a name on base interface")
|
|
|
|
# Same, but duplicated across implemented interfaces
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
E implements F;
|
|
E implements G;
|
|
interface F {
|
|
attribute long x;
|
|
};
|
|
interface G {
|
|
attribute long x;
|
|
};
|
|
interface E {};
|
|
""")
|
|
parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Should have thrown on implemented interfaces "
|
|
"duplicating each other's member names")
|
|
|
|
# Same, but duplicated across indirectly implemented interfaces
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
H implements I;
|
|
H implements J;
|
|
I implements K;
|
|
interface K {
|
|
attribute long x;
|
|
};
|
|
interface L {
|
|
attribute long x;
|
|
};
|
|
interface I {};
|
|
interface J : L {};
|
|
interface H {};
|
|
""")
|
|
parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Should have thrown on indirectly implemented interfaces "
|
|
"duplicating each other's member names")
|
|
|
|
# Same, but duplicated across an implemented interface and its parent
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
M implements N;
|
|
interface O {
|
|
attribute long x;
|
|
};
|
|
interface N : O {
|
|
attribute long x;
|
|
};
|
|
interface M {};
|
|
""")
|
|
parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Should have thrown on implemented interface and its "
|
|
"ancestor duplicating member names")
|
|
|
|
# Reset the parser so we can actually find things where we expect
|
|
# them in the list
|
|
parser = parser.reset()
|
|
|
|
# Diamonds should be allowed
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
P implements Q;
|
|
P implements R;
|
|
Q implements S;
|
|
R implements S;
|
|
interface Q {};
|
|
interface R {};
|
|
interface S {
|
|
attribute long x;
|
|
};
|
|
interface P {};
|
|
""")
|
|
results = parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(not threw, "Diamond inheritance is fine")
|
|
harness.check(results[6].identifier.name, "S", "We should be looking at 'S'")
|
|
harness.check(len(results[6].members), 1, "S should have one member")
|
|
harness.check(results[6].members[0].identifier.name, "x",
|
|
"S's member should be 'x'")
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
interface TestInterface {
|
|
};
|
|
callback interface TestCallbackInterface {
|
|
};
|
|
TestInterface implements TestCallbackInterface;
|
|
""")
|
|
results = parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(threw,
|
|
"Should not allow callback interfaces on the right-hand side "
|
|
"of 'implements'")
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
interface TestInterface {
|
|
};
|
|
callback interface TestCallbackInterface {
|
|
};
|
|
TestCallbackInterface implements TestInterface;
|
|
""")
|
|
results = parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(threw,
|
|
"Should not allow callback interfaces on the left-hand side of "
|
|
"'implements'")
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
interface TestInterface {
|
|
};
|
|
dictionary Dict {
|
|
};
|
|
Dict implements TestInterface;
|
|
""")
|
|
results = parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(threw,
|
|
"Should not allow non-interfaces on the left-hand side "
|
|
"of 'implements'")
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse("""
|
|
interface TestInterface {
|
|
};
|
|
dictionary Dict {
|
|
};
|
|
TestInterface implements Dict;
|
|
""")
|
|
results = parser.finish()
|
|
except:
|
|
threw = True
|
|
|
|
harness.ok(threw,
|
|
"Should not allow non-interfaces on the right-hand side "
|
|
"of 'implements'")
|
|
|