Son CV dans un terminal web en Javascript! https://terminal-cv.gregandev.fr
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
2.7 KiB

2 years ago
var fs = require('graceful-fs');
var test = require('tap').test;
var path = require('path');
var writeStream = require('../index.js');
var rename = fs.rename;
fs.rename = function(from, to, cb) {
setTimeout(function() {
rename(from, to, cb);
}, 100);
};
test('basic', function(t) {
// open 10 write streams to the same file.
// then write to each of them, and to the target
// and verify at the end that each of them does their thing
var target = path.resolve(__dirname, 'test.txt');
var n = 10;
// We run all of our assertions twice:
// once for finish, once for close
// There are 6 assertions, two fixed, plus 4 lines in the file.
t.plan(n * 2 * 6);
var streams = [];
for (var i = 0; i < n; i++) {
var s = writeStream(target);
s.on('finish', verifier('finish', i));
s.on('close', verifier('close', i));
streams.push(s);
}
function verifier(ev, num) {
return function() {
if (ev === 'close') {
t.equal(this.__emittedFinish, true, num + '. closed only after finish');
} else {
this.__emittedFinish = true;
t.equal(ev, 'finish', num + '. finished');
}
// make sure that one of the atomic streams won.
var res = fs.readFileSync(target, 'utf8');
var lines = res.trim().split(/\n/);
lines.forEach(function(line, lineno) {
var first = lines[0].match(/\d+$/)[0];
var cur = line.match(/\d+$/)[0];
t.equal(cur, first, num + '. line ' + lineno + ' matches');
});
var resExpr = /^first write \d+\nsecond write \d+\nthird write \d+\nfinal write \d+\n$/;
t.similar(res, resExpr, num + '. content matches');
};
}
// now write something to each stream.
streams.forEach(function(stream, i) {
stream.write('first write ' + i + '\n');
});
// wait a sec for those writes to go out.
setTimeout(function() {
// write something else to the target.
fs.writeFileSync(target, 'brutality!\n');
// write some more stuff.
streams.forEach(function(stream, i) {
stream.write('second write ' + i + '\n');
});
setTimeout(function() {
// Oops! Deleted the file!
fs.unlinkSync(target);
// write some more stuff.
streams.forEach(function(stream, i) {
stream.write('third write ' + i + '\n');
});
setTimeout(function() {
fs.writeFileSync(target, 'brutality TWO!\n');
streams.forEach(function(stream, i) {
stream.end('final write ' + i + '\n');
});
}, 50);
}, 50);
}, 50);
});
test('cleanup', function(t) {
fs.readdirSync(__dirname)
.filter(function(f) {
return f.match(/^test.txt/);
})
.forEach(function(file) {
fs.unlinkSync(path.resolve(__dirname, file));
});
t.end();
});