'use strict'

const fs = require('fs')
const split = require('split2')
const t = require('tap')
const tmp = require('tmp')
const path = require('path')
const childProcess = require('child_process')
const file1 = tmp.fileSync()
const file2 = tmp.fileSync()

t.plan(5)

const args = [
  path.join(__dirname, '../tee.js'),
  'info',
  file1.name,
  'warn',
  file2.name
]

const child = childProcess.spawn(process.execPath, args, {
  cwd: path.join(__dirname),
  env: process.env,
  stdio: ['pipe', 'pipe', 'pipe'],
  detached: false
})

t.teardown(() => {
  child.stdin.end()
  child.kill()
})

const messages = [{
  level: 30,
  msg: 'hello'
}, {
  level: 20,
  msg: 'should not be seen'
}, {
  level: 40,
  msg: 'a warning'
}]

const expected1 = [messages[0], messages[2]]
const expected2 = [messages[2]]

messages.forEach(line => child.stdin.write(JSON.stringify(line) + '\n'))
child.stderr.pipe(process.stderr)

child.stdout.pipe(split(JSON.parse)).on('data', function (data) {
  t.same(data, messages.shift())
  if (messages.length === 0) {
    checkFile('info', file1, expected1)
    checkFile('warn', file2, expected2)
  }
})

function checkFile (level, file, expected) {
  t.test('checking ' + level + ' file', function (t) {
    t.plan(expected.length)

    fs.createReadStream(file.name)
      .pipe(split(JSON.parse))
      .on('data', function (data) {
        t.same(data, expected.shift())
      })
  })
}

@@ -250,16 +250,48 @@
 Sync()%0A%0A
+t.test('bin-multiple', t =%3E %7B%0A  
 t.plan(5
@@ -293,16 +293,18 @@
 lan(5)%0A%0A
+  
 const ar
@@ -310,16 +310,18 @@
 rgs = %5B%0A
+  
   path.j
@@ -349,16 +349,18 @@
 e.js'),%0A
+  
   'info'
@@ -361,16 +361,18 @@
 'info',%0A
+  
   file1.
@@ -377,16 +377,18 @@
 1.name,%0A
+  
   'warn'
@@ -389,16 +389,18 @@
 'warn',%0A
+  
   file2.
@@ -404,19 +404,23 @@
 e2.name%0A
+  
 %5D%0A%0A
+  
 const ch
@@ -470,16 +470,18 @@
 args, %7B%0A
+  
   cwd: p
@@ -501,16 +501,18 @@
 rname),%0A
+  
   env: p
@@ -523,16 +523,18 @@
 ss.env,%0A
+  
   stdio:
@@ -560,16 +560,18 @@
 pipe'%5D,%0A
+  
   detach
@@ -580,20 +580,24 @@
 : false%0A
+  
 %7D)%0A%0A
+  
 t.teardo
@@ -607,16 +607,18 @@
 () =%3E %7B%0A
+  
   child.
@@ -629,16 +629,18 @@
 n.end()%0A
+  
   child.
@@ -646,20 +646,24 @@
 .kill()%0A
+  
 %7D)%0A%0A
+  
 const me
@@ -674,16 +674,18 @@
 es = %5B%7B%0A
+  
   level:
@@ -687,24 +687,26 @@
 evel: 30,%0A  
+ 
+ 
 msg: 'hello'
@@ -706,23 +706,27 @@
 'hello'%0A
+  
 %7D, %7B%0A  
+ 
+ 
 level: 2
@@ -728,16 +728,18 @@
 el: 20,%0A
+  
   msg: '
@@ -758,21 +758,25 @@
 e seen'%0A
+  
 %7D, %7B%0A
+  
   level:
@@ -782,16 +782,18 @@
 : 40,%0A  
+ 
+ 
 msg: 'a 
@@ -805,12 +805,16 @@
 ng'%0A
+  
 %7D%5D%0A%0A
+  
 cons
@@ -854,16 +854,18 @@
 ges%5B2%5D%5D%0A
+  
 const ex
@@ -889,16 +889,18 @@
 es%5B2%5D%5D%0A%0A
+  
 messages
@@ -964,16 +964,18 @@
  '%5Cn'))%0A
+  
 child.st
@@ -1001,16 +1001,18 @@
 tderr)%0A%0A
+  
 child.st
@@ -1065,24 +1065,26 @@
 on (data) %7B%0A
+  
   t.same(dat
@@ -1106,16 +1106,18 @@
 ft())%0A  
+ 
+ 
 if (mess
@@ -1133,24 +1133,26 @@
 th === 0) %7B%0A
+  
     checkFil
@@ -1179,24 +1179,26 @@
 ected1)%0A    
+ 
+ 
 checkFile('w
@@ -1227,14 +1227,20 @@
 )%0A  
-%7D%0A
+  %7D%0A  
 %7D)%0A%0A
+  
 func
@@ -1282,16 +1282,18 @@
 ed) %7B%0A  
+ 
+ 
 t.test('
@@ -1341,16 +1341,18 @@
 ) %7B%0A    
+  
 t.plan(e
@@ -1372,16 +1372,18 @@
 h)%0A%0A    
+ 
+ 
 fs.creat
@@ -1411,16 +1411,18 @@
 )%0A      
+  
 .pipe(sp
@@ -1444,16 +1444,18 @@
 )%0A      
+ 
+ 
 .on('dat
@@ -1472,24 +1472,26 @@
 on (data) %7B%0A
+  
         t.sa
@@ -1527,14 +1527,23 @@
     
+ 
+ 
 %7D)%0A  
+ 
+ 
 %7D)%0A
-%7D
+  %7D%0A%7D)
 %0A

move bin-multiple test to tap.test callback (#103)