_mergeCoverageForistanbul.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /**
  2. * Created by dongyancen on 14-3-26.
  3. */
  4. var fs = require('fs');
  5. var browsers = ['Chrome', 'Firefox', 'PhantomJS', 'IE'];
  6. var result_forBrowser = {};
  7. var jsonFileBasePath = './spec/coverage/json_files/';
  8. var jsonFiles = fs.readdirSync(jsonFileBasePath);
  9. var finalJsonFile = 'defaultFileName';
  10. var curPath = '/spec';
  11. var resultPath = 'spec/coverage';
  12. //找出所有的json文件
  13. for (var i = 0; i < jsonFiles.length; i++) {
  14. // json文件名必须是有8位的日期和6位的时间戳如:-20140326_161249
  15. if (!isJsonFiles(jsonFiles[i])) {
  16. jsonFiles.splice(i, 1);
  17. i--;
  18. }
  19. }
  20. //没有找到合适的文件
  21. if(jsonFiles.length==0)return;
  22. //先排序 按时间从小到大 及从旧到新
  23. jsonFiles.sort(function (f1, f2) {
  24. var t1 = getFileTime(f1);//形如['-20140326_161249','20140326','161249']
  25. var t2 = getFileTime(f2);
  26. var dateDiff = parseInt(t1[1]) - parseInt(t2[1]);
  27. if (dateDiff != 0)return dateDiff;
  28. else return parseInt(t1[2]) - parseInt(t2[2]);
  29. });
  30. //以时间命名新的文件
  31. finalJsonFile = getFileTime(jsonFiles[jsonFiles.length-1])[0].substring(1);
  32. //如:20140326_161249
  33. //取最新的
  34. // 按浏览器类型分类 result_forBrowser属性形如:{'Crome':'filename1','Firefox':'filename2'}
  35. for (i = 0; i < jsonFiles.length; i++) {
  36. for (var j = 0; j < browsers.length; j++) {
  37. if (eval('/' + browsers[j] + '/.test("' + jsonFiles[i] + '");')) {
  38. eval('result_forBrowser.' + browsers[j] + '="' + jsonFiles[i] + '";');
  39. }
  40. }
  41. }
  42. //以上得到所有要合计的json文件
  43. //读取,合计数字,需要合计的属性: 's' 'b' 'f' 'l'
  44. //修正路径
  45. var jsonToWrite = null;
  46. for (var a in result_forBrowser) {
  47. var r = fs.readFileSync(jsonFileBasePath + result_forBrowser[a]);
  48. if (!jsonToWrite) {
  49. jsonToWrite = JSON.parse(r);
  50. continue;
  51. } else {
  52. jsonToWrite = mergeResult(jsonToWrite, JSON.parse(r));
  53. }
  54. }
  55. //写文件
  56. fs.writeFileSync(jsonFileBasePath+finalJsonFile+'.json',JSON.stringify(jsonToWrite));
  57. function isJsonFiles(fileName) {
  58. var e = fileName.substring(fileName.lastIndexOf(".") + 1);
  59. // json文件名必须是有8位的日期和6位的时间戳如:-20140326_161249
  60. //否则无法判断文件生成时间,也就无法合并同一次运行产生的结果
  61. return e == 'json' && getFileTime(fileName);
  62. }
  63. function getFileTime(fileName) {
  64. // json文件名必须是有8位的日期和6位的时间戳如:-20140326_161249
  65. return fileName.match(/-(\d{8})_(\d{6})/);
  66. }
  67. function mergeResult(allR, addR) {
  68. var resultR = {};
  69. for (var allRKey in allR) {
  70. if (addR[allRKey]) {
  71. allR[allRKey] = mergeDetail(allR[allRKey], addR[allRKey], 's', 1);
  72. allR[allRKey] = mergeDetail(allR[allRKey], addR[allRKey], 'f', 1);
  73. allR[allRKey] = mergeDetail(allR[allRKey], addR[allRKey], 'l', 1);
  74. allR[allRKey] = mergeDetail(allR[allRKey], addR[allRKey], 'b', 2);
  75. }
  76. //修正路径
  77. resultR[fixPath(allRKey)] = allR[allRKey]
  78. }
  79. return resultR;
  80. }
  81. //type = 1 合并 s f l ,如:{"1":1,"2":1,"3":1}
  82. //type = 2 合并 b ,如:{"1":[0,0],"2":[0,0]}
  83. function mergeDetail(allEle, addEle, attrName, type) {
  84. if (allEle[attrName] && addEle[attrName]) {
  85. if (type == 1) {
  86. for (var k in allEle[attrName]) {
  87. //todo 现在没有考虑两个文件中同一项覆盖率的统计行数不一致的问题
  88. if ( parseInt(allEle[attrName][k])==0 && parseInt(addEle[attrName][k]) ==1) {
  89. allEle[attrName][k] = 1;
  90. }
  91. }
  92. }
  93. else if (type == 2) {
  94. for (var k in allEle[attrName]) {
  95. //todo 现在没有考虑两个文件中同一项覆盖率的统计行数不一致的问题
  96. if (addEle[attrName][k]) {
  97. if (parseInt(allEle[attrName][k][0])==0 &&parseInt(addEle[attrName][k][0])==1 ) {
  98. allEle[attrName][k][0] = 1;
  99. }
  100. if (parseInt(allEle[attrName][k][1])==0 &&parseInt(addEle[attrName][k][1])==1 ) {
  101. allEle[attrName][k][1] = 1;
  102. }
  103. }
  104. }
  105. }
  106. }
  107. return allEle;
  108. }
  109. //修正路径
  110. function fixPath(oldPath){
  111. //例如把 "D:/workspace/ufinder/_src/core/finder.js" 修正为
  112. // spec/coverage/_src/core/finder.js 注意这里一定要用相对路径(相对于_spec/coverage)
  113. var s = __dirname.replace(/\\/g,'/');
  114. if(s.lastIndexOf(curPath)){
  115. s = s.substring(0,s.lastIndexOf(curPath) );
  116. }
  117. oldPath = oldPath.replace(s,resultPath);
  118. return oldPath;
  119. }
  120. console.log(finalJsonFile);