it(test, () => {
            test = test.replace(/⨂/g, '');
            let [lhs, rhs] = test.split(/ [A-Z]+ /).map(toNormalPredicate);
            let expected = test.match(/ ([A-Z]+) /)![1];
            let actual = '';

            // NB: isSubsetOf() can't handle alternations, and can't determine disjoint/overlapping relationships.
            if (lhs.indexOf('|') === -1 && rhs.indexOf('|') === -1) {
                let isSubset = isSubsetOf(lhs, rhs);
                let isSuperset = isSubsetOf(rhs, lhs);
                if (isSubset && isSuperset) actual = 'EQUALS';
                else if (isSubset) actual = 'SUBSET';
                else if (isSuperset) actual = 'SUPERSET';
            }

            // If isSubsetOf() couldn't determine the relationship, then use intersect instead.
            if (actual === '') {
                let intersection = intersect(lhs, rhs);
                if (lhs === rhs) actual = 'EQUALS';
                else if (intersection === lhs) actual = 'SUBSET';
                else if (intersection === rhs) actual = 'SUPERSET';
                else if (intersection === NONE) actual = 'DISJOINT';
                else actual = 'OVERLAPS';
            }
            expect(actual).equals(expected);
        });
 it(test, () => {
     test = test.replace(/⨂/g, '');
     let lhsA = test.split(' = ')[0].split(' ∩ ')[0];
     let lhsB = test.split(' = ')[0].split(' ∩ ')[1];
     let rhs = test.split(' = ')[1];
     let actual: string;
     let expected = rhs;
     try {
         actual = intersect(toNormalPredicate(lhsA), toNormalPredicate(lhsB));
     }
     catch (ex) {
         actual = 'ERROR';
     }
     expect(actual).equals(expected);
 });
 expect(edges.every(edge => {
     let intersection = intersect(edge.parent.predicate, edge.child.predicate);
     return intersection === edge.child.predicate;
 })).to.be.true;