def WebIDLTest(parser, harness):
    threw = False
    try:
        parser.parse(
            """
            interface Foo {
              [CEReactions(DOMString a)] undefined foo(boolean arg2);
            };
        """
        )

        parser.finish()
    except Exception:
        threw = True

    harness.ok(threw, "Should have thrown for [CEReactions] with an argument")

    parser = parser.reset()
    threw = False
    try:
        parser.parse(
            """
            interface Foo {
              [CEReactions(DOMString b)] readonly attribute boolean bar;
            };
        """
        )

        parser.finish()
    except Exception:
        threw = True

    harness.ok(threw, "Should have thrown for [CEReactions] with an argument")

    parser = parser.reset()
    threw = False
    try:
        parser.parse(
            """
            interface Foo {
              [CEReactions] attribute boolean bar;
            };
        """
        )

        parser.finish()
    except Exception as e:
        harness.ok(
            False,
            "Shouldn't have thrown for [CEReactions] used on writable attribute. %s"
            % e,
        )
        threw = True

    parser = parser.reset()
    threw = False
    try:
        parser.parse(
            """
            interface Foo {
              [CEReactions] undefined foo(boolean arg2);
            };
        """
        )

        parser.finish()
    except Exception as e:
        harness.ok(
            False,
            "Shouldn't have thrown for [CEReactions] used on regular operations. %s"
            % e,
        )
        threw = True

    parser = parser.reset()
    threw = False
    try:
        parser.parse(
            """
            interface Foo {
              [CEReactions] readonly attribute boolean A;
            };
        """
        )

        parser.finish()
    except Exception:
        threw = True

    harness.ok(
        threw, "Should have thrown for [CEReactions] used on a readonly attribute"
    )

    parser = parser.reset()
    threw = False
    try:
        parser.parse(
            """
            [CEReactions]
            interface Foo {
            }
        """
        )

        parser.finish()
    except Exception:
        threw = True

    harness.ok(threw, "Should have thrown for [CEReactions] used on a interface")

    parser = parser.reset()
    threw = False
    try:
        parser.parse(
            """
          interface Foo {
            [CEReactions] getter any(DOMString name);
          };
        """
        )
        parser.finish()
    except Exception:
        threw = True

    harness.ok(threw, "Should have thrown for [CEReactions] used on a named getter")

    parser = parser.reset()
    threw = False
    try:
        parser.parse(
            """
          interface Foo {
            [CEReactions] legacycaller double compute(double x);
          };
        """
        )
        parser.finish()
    except Exception:
        threw = True

    harness.ok(threw, "Should have thrown for [CEReactions] used on a legacycaller")

    parser = parser.reset()
    threw = False
    try:
        parser.parse(
            """
          interface Foo {
            [CEReactions] stringifier DOMString ();
          };
        """
        )
        parser.finish()
    except Exception:
        threw = True

    harness.ok(threw, "Should have thrown for [CEReactions] used on a stringifier")
