Turn audio into a shareable video. forked from nypublicradio/audiogram

frame-test.js 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. var tape = require("tape"),
  2. Canvas = require("canvas"),
  3. d3 = require("d3"),
  4. path = require("path"),
  5. fs = require("fs"),
  6. initializeCanvas = require("../audiogram/initialize-canvas.js"),
  7. drawFrames = require("../audiogram/draw-frames.js");
  8. require("mkdirp").sync(path.join(__dirname, "tmp", "frames"));
  9. var frameDir = path.join(__dirname, "tmp", "frames");
  10. tape.test("Draw frame", function(test){
  11. var options = {
  12. width: 1280,
  13. height: 720,
  14. backgroundColor: "#f00",
  15. foregroundColor: "#fff",
  16. waveTop: 340,
  17. waveBottom: 380,
  18. waveform: [[0, 1, 0], [1, 0.1, 1]]
  19. };
  20. initializeCanvas(options, function(err, renderer){
  21. test.error(err);
  22. drawFrames(renderer, {
  23. numFrames: 2,
  24. frameDir: frameDir
  25. }, function(err){
  26. test.error(err);
  27. checkFrame(test, options);
  28. });
  29. });
  30. });
  31. tape.test("Default colors", function(test){
  32. var options = {
  33. width: 1280,
  34. height: 720,
  35. waveTop: 340,
  36. waveBottom: 380,
  37. waveform: [[0, 1, 0], [1, 0.1, 1]]
  38. };
  39. initializeCanvas(options, function(err, renderer){
  40. test.error(err);
  41. drawFrames(renderer, {
  42. numFrames: 2,
  43. frameDir: frameDir
  44. }, function(err){
  45. test.error(err);
  46. checkFrame(test, options);
  47. });
  48. });
  49. });
  50. tape.test("Square frame", function(test){
  51. var options = {
  52. width: 720,
  53. height: 720,
  54. backgroundColor: "#fc0",
  55. foregroundColor: "#fff",
  56. waveTop: 340,
  57. waveBottom: 380,
  58. waveform: [[0, 1, 0], [1, 0.1, 1]]
  59. };
  60. initializeCanvas(options, function(err, renderer){
  61. test.error(err);
  62. drawFrames(renderer, {
  63. numFrames: 2,
  64. frameDir: frameDir
  65. }, function(err){
  66. test.error(err);
  67. checkFrame(test, options);
  68. });
  69. });
  70. });
  71. function checkFrame(test, options) {
  72. var testCanvas = new Canvas(options.width, options.height),
  73. context = testCanvas.getContext("2d");
  74. d3.queue()
  75. .defer(fs.readFile, path.join(frameDir, "000001.png"))
  76. .defer(fs.readFile, path.join(frameDir, "000002.png"))
  77. .await(function(e, f1, f2){
  78. test.error(e);
  79. var img = new Canvas.Image;
  80. img.src = f1;
  81. var bg = getColor(options.backgroundColor || "#fff"),
  82. fg = getColor(options.waveColor || options.foregroundColor || "#000");
  83. context.drawImage(img, 0, 0, options.width, options.height);
  84. test.deepEqual(getColor(context.getImageData(0, 0, 1, 1)), bg);
  85. test.deepEqual(getColor(context.getImageData(options.width - 1, options.height - 1, 1, 1)), bg);
  86. test.deepEqual(getColor(context.getImageData(0, options.height / 2 - 10, 1, 1)), bg);
  87. test.deepEqual(getColor(context.getImageData(options.width - 1, options.height / 2 + 10, 1, 1)), bg);
  88. test.deepEqual(getColor(context.getImageData(options.width / 2, options.height / 2, 1, 1)), fg);
  89. test.deepEqual(getColor(context.getImageData(options.width / 2, options.height / 2 - 10, 1, 1)), fg);
  90. test.deepEqual(getColor(context.getImageData(options.width / 2, options.height / 2 + 10, 1, 1)), fg);
  91. img.src = f2;
  92. context.drawImage(img, 10, 0, options.width, options.height);
  93. test.deepEqual(getColor(context.getImageData(options.width / 2, options.height / 2, 1, 1)), fg);
  94. test.deepEqual(getColor(context.getImageData(options.width / 2 - 10, options.height / 2 - 10, 1, 1)), bg);
  95. test.deepEqual(getColor(context.getImageData(options.width / 2 - 10, options.height / 2 + 10, 1, 1)), bg);
  96. test.end();
  97. });
  98. }
  99. function getColor(c) {
  100. if (typeof c === "string") {
  101. c = d3.color(c);
  102. return [c.r, c.g, c.b];
  103. } else {
  104. return Array.prototype.slice.call(c.data, 0, 3);
  105. }
  106. }
  107. // Cleanup
  108. tape.onFinish(function(){
  109. require("rimraf")(path.join(__dirname, "tmp"), function(err){
  110. if (err) {
  111. throw err;
  112. }
  113. });
  114. });