var browserify = require('../');
var vm = require('vm');
var test = require('tap').test;
var fs = require('fs');

var testFiles = [
    __dirname + '/multi_entry/a.js',
    __dirname + '/multi_entry/b.js',
    __dirname + '/multi_entry/c.js'
];

test('multi entry', function (t) {
    t.plan(6);
    
    var b = browserify([
        testFiles[0],
        testFiles[1]
    ]);
    b.add(testFiles[2]);
    
    b.on('dep', function(row) {
        if (row.entry) {
            t.ok(testFiles.indexOf(row.file) > -1, 'should contain full entry path');
        }
    });
    
    b.bundle(function (err, src) {
        var c = {
            times : 0,
            t : t
        };
        vm.runInNewContext(src, c);
    });
});

test('multi entry relative', function (t) {
    t.plan(6);
    
    var rTestFiles = testFiles.map(function(x) {
        return x.replace(__dirname + '/', '');
    });

    var b = browserify({
        entries: [rTestFiles[0], rTestFiles[1]],
        basedir: __dirname
    });
    b.add(rTestFiles[2]);
    
    b.on('dep', function(row) {
        if (row.entry) {
            t.ok(testFiles.indexOf(row.file) > -1, 'should contain full entry path');
        }
    });
    
    b.bundle(function (err, src) {
        var c = {
            times : 0,
            t : t
        };
        vm.runInNewContext(src, c);
    });
});

test('multi entry relative cwd', function (t) {
    t.plan(6);
    
    var rTestFiles = testFiles.map(function(x) {
        return x.replace(__dirname + '/', './');
    });

    var b = browserify({
        entries: [rTestFiles[0], rTestFiles[1]],
        basedir: __dirname
    });
    b.add(rTestFiles[2]);
    
    b.on('dep', function(row) {
        if (row.entry) {
            t.ok(testFiles.indexOf(row.file) > -1, 'should contain full entry path');
        }
    });
    
    b.bundle(function (err, src) {
        var c = {
            times : 0,
            t : t
        };
        vm.runInNewContext(src, c);
    });
});

test('entries as streams', function (t) {
    t.plan(6);
    
    // commondir blows up with streams and without basedir
    var opts = { basedir: __dirname + '/multi_entry' };
    
    var b = browserify([
        fs.createReadStream(testFiles[0]),
        fs.createReadStream(testFiles[1])
    ], opts);
    b.add(fs.createReadStream(testFiles[2]));
    
    b.on('dep', function(row) {
        if (row.entry) {
            t.similar(
                row.file,
                RegExp(__dirname + '/multi_entry/_stream_[\\d].js'),
                'should be full entry path'
            );
        }
    });
    
    b.bundle(function (err, src) {
        var c = {
            times : 0,
            t : t
        };
        vm.runInNewContext(src, c);
    });
});
