function verify_compile_success(source, expected) {
        var ast = JuttleParser.parseFilter(source).ast;

        var semantic = new SemanticPass({ now: new JuttleMoment() });
        semantic.sa_expr(ast);

        ast = simplifier.simplify(ast);

        var compiler = new FilterAWSCompiler({
            supported_products: ['EC2', 'EBS']
        });

        var search_expr = compiler.compile(ast);
        expect(search_expr).to.deep.equal(expected);
    }
    function verify_compile_error(source, feature) {
        var ast = JuttleParser.parseFilter(source).ast;

        var semantic = new SemanticPass({ now: new JuttleMoment() });
        semantic.sa_expr(ast);

        ast = simplifier.simplify(ast);

        var compiler = compiler || new FilterAWSCompiler({
            supported_products: ['EC2', 'EBS']
        });

        try {
            compiler.compile(ast);
            throw new Error('Compile succeeded when it should have failed');
        } catch (e) {
            expect(e).to.be.instanceOf(JuttleErrors.CompileError);
            expect(e.code).to.equal('FILTER-FEATURE-NOT-SUPPORTED');
            expect(e.info.feature).to.equal(feature);
        }
    }