# Code coverage report for lib/index.js

## Statements: 100% (54 / 54) Branches: 100% (26 / 26) Functions: 100% (6 / 6) Lines: 100% (54 / 54) Ignored: 1 branch

All files » lib/ » index.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127

    1

    1

    1
    3

    3
    424
    424

    424

    4
    4

    4
    4

    3
    3

    3
    3

    3
    3

    3
    3

    263
    263

    263

    48
    48

    48

    48
    48
    591
    48
    48

    48

    23
    23

    23

    2
    2

    2
    2

    424
    7
    7

    3

    3
    2

    1

    1
    3
    3
    2

    1
    1

    1
    1
     /*
    Copyright (c) 2012, Yahoo! Inc. All rights reserved.
    Code licensed under the BSD License:
    http://yuilibrary.com/license/
    */

    var fs = require('fs'),
        path = require('path');

    /* istanbul ignore next */
    var exists = fs.exists || path.exists;

    var walkFile = function(str, cb) {
        var data = [], item;

        [ 'end_of_record' ].concat(str.split('\n')).forEach(function(line) {
            line = line.trim();
            var allparts = line.split(':'),
                parts = [allparts.shift(), allparts.join(':')],
                lines, fn;

            switch (parts[0].toUpperCase()) {
                case 'TN':
                    item.title = parts[1].trim();
                    break;
                case 'SF':
                    item.file = parts.slice(1).join(':').trim();
                    break;
                case 'FNF':
                    item.functions.found = Number(parts[1].trim());
                    break;
                case 'FNH':
                    item.functions.hit = Number(parts[1].trim());
                    break;
                case 'LF':
                    item.lines.found = Number(parts[1].trim());
                    break;
                case 'LH':
                    item.lines.hit = Number(parts[1].trim());
                    break;
                case 'DA':
                    lines = parts[1].split(',');
                    item.lines.details.push({
                        line: Number(lines[0]),
                        hit: Number(lines[1])
                    });
                    break;
                case 'FN':
                    fn = parts[1].split(',');
                    item.functions.details.push({
                        name: fn[1],
                        line: Number(fn[0])
                    });
                    break;
                case 'FNDA':
                    fn = parts[1].split(',');
                    item.functions.details.some(function(i, k) {
                        if (i.name === fn[1] && i.hit === undefined) {
                            item.functions.details[k].hit = Number(fn[0]);
                            return true;
                        }
                    });
                    break;
                case 'BRDA':
                    fn = parts[1].split(',');
                    item.branches.details.push({
                        line: Number(fn[0]),
                        block: Number(fn[1]),
                        branch: Number(fn[2]),
                        taken: ((fn[3] === '-') ? 0 : Number(fn[3]))
                    });
                    break;
                case 'BRF':
                    item.branches.found = Number(parts[1]);
                    break;
                case 'BRH':
                    item.branches.hit = Number(parts[1]);
                    break;
            }

            if (line.indexOf('end_of_record') > -1) {
                data.push(item);
                item = {
                  lines: {
                      found: 0,
                      hit: 0,
                      details: []
                  },
                  functions: {
                      hit: 0,
                      found: 0,
                      details: []
                  },
                  branches: {
                    hit: 0,
                    found: 0,
                    details: []
                  }
                };
            }
        });

        data.shift();

        if (data.length) {
            cb(null, data);
        } else {
            cb('Failed to parse string');
        }
    };

    var parse = function(file, cb) {
        exists(file, function(x) {
            if (!x) {
                return walkFile(file, cb);
            }
            fs.readFile(file, 'utf8', function(err, str) {
                walkFile(str, cb);
            });
        });

    };

    module.exports = parse;
    module.exports.source = walkFile;