"use strict";

const chai = require( "chai" );
const helpers = require( "./helpers" );
const pass = require( "pegjs-dev" ).compiler.passes.transform.removeProxyRules;

chai.use( helpers );

const expect = chai.expect;

describe( "compiler pass |removeProxyRules|", function () {

    describe( "when a proxy rule isn't listed in |allowedStartRules|", function () {

        it( "updates references and removes it", function () {

            expect( pass ).to.changeAST(
                [
                    "start = proxy",
                    "proxy = proxied",
                    "proxied = 'a'"
                ].join( "\n" ),
                {
                    rules: [
                        {
                            name: "start",
                            expression: { type: "rule_ref", name: "proxied" }
                        },
                        { name: "proxied" }
                    ]
                },
                { allowedStartRules: [ "start" ] }
            );

        } );

    } );

    describe( "when a proxy rule is listed in |allowedStartRules|", function () {

        it( "updates references but doesn't remove it", function () {

            expect( pass ).to.changeAST(
                [
                    "start = proxy",
                    "proxy = proxied",
                    "proxied = 'a'"
                ].join( "\n" ),
                {
                    rules: [
                        {
                            name: "start",
                            expression: { type: "rule_ref", name: "proxied" }
                        },
                        {
                            name: "proxy",
                            expression: { type: "rule_ref", name: "proxied" }
                        },
                        { name: "proxied" }
                    ]
                },
                { allowedStartRules: [ "start", "proxy" ] }
            );

        } );

    } );

} );