var test = require('tape')
var mdeps = require('module-deps');
var bpack = require('browser-pack');
var insert = require('../');
var concat = require('concat-stream');
var vm = require('vm');

test('always true insert', function (t) {
    t.plan(10);
    var s = mdeps({
        modules: {
            buffer: require.resolve('buffer/'),
            timers: require.resolve('timers-browserify')
        }
    });
    s.pipe(bpack({ raw: true })).pipe(concat(function (src) {
        var c = {
            t: t,
            process: 'sandbox process',
            Buffer: 'sandbox Buffer',
            __filename: 'sandbox __filename',
            __dirname: 'sandbox __dirname',
            custom: 'sandbox custom',
            self: { xyz: 555 }
        };
        vm.runInNewContext(src, c);
    }));
    s.write({ transform: inserter({ always: true }), global: true });
    s.end(__dirname + '/always/main.js');
});

test('always true insert custom globals without defaults', function (t) {
    t.plan(7);
    var s = mdeps({
        modules: {
            buffer: require.resolve('buffer/'),
            timers: require.resolve('timers-browserify')
        }
    });
    s.pipe(bpack({ raw: true })).pipe(concat(function (src) {
        var c = {
            t: t,
            process: 'sandbox process',
            Buffer: 'sandbox Buffer',
            __filename: 'sandbox __filename',
            __dirname: 'sandbox __dirname',
            custom: 'sandbox custom',
            self: { xyz: 555 }
        };
        vm.runInNewContext(src, c);
    }));
    s.write({
        transform: inserter({ always: true, vars: {
            global: {},
            process: undefined,
            Buffer: undefined,
            __filename: undefined,
            __dirname: undefined,
            custom: function() { return '"inserted custom"' }
        }}),
        global: true
    });
    s.end(__dirname + '/always/custom_globals_without_defaults.js');
});

test('always truthy-but-not-true insert hidden from quick test is not really inserted; true is', function (t) {
    t.plan(2);
    var testit = function(always, expected) {
        var s = mdeps({
            modules: {
                buffer: require.resolve('buffer/'),
                timers: require.resolve('timers-browserify')
            }
        });
        s.pipe(bpack({ raw: true })).pipe(concat(function (src) {
            var c = {
                t: t,
                process: 'sandbox process',
                Buffer: 'sandbox Buffer',
                __filename: 'sandbox __filename',
                __dirname: 'sandbox __dirname',
                custom: 'sandbox custom',
                expected: expected,
                self: { xyz: 555 }
            };
            vm.runInNewContext(src, c);
        }));
        s.write({
            transform: inserter({ always: always, vars: {
                custom: function() { return '"inserted custom"' }
            }}),
            global: true
        })
        s.end(__dirname + '/always/hidden_from_quick_test.js');
    };

    var always = 'truthy', expected = 'sandbox custom';
    testit(always, expected);

    always = true; expected = 'inserted custom';
    testit(always, expected);
});

function inserter (opts) {
    return function (file) {
        return insert(file, opts);
    };
}
