Best Python code snippet using avocado_python
filter_functions.js
Source:filter_functions.js  
1import _ from 'lodash'2function totalGoals(item) {3  let totalGoals;4  if (item.view.scores) {5    totalGoals = parseInt(item.view.scores['2'].home) + parseInt(item.view.scores['2'].away);6    return totalGoals <= 07  } else {8    return false9  }10}11function goalsDraw(item) {12  return parseInt(item.view.scores['2'].home) === parseInt(item.view.scores['2'].away);13}14function startTB(item) {15  if (item.odds['1_3']) {16    let totalOdds = item.odds['1_3'];17    let startTotalOdd = totalOdds[totalOdds.length - 1];18    //let handicaps_1_8 = ['2.5, 3.0', '3.0, 3,5'];19    //let handicaps_1_9 = ['3.5', '3.5, 4.0', '4.0, 4.5', '4.5', '4.5, 5.0', '5.0, 5.5', '5,5', '5.5, 6.0', '6.0, 6.5', '6.5', '6.5, 7.0', '7.0, 7.5', '7.5', '7.5, 8.0', '8.0, 8.5', '8.5'];20    if (startTotalOdd) {21      //let overOd = parseFloat(startTotalOdd.over_od);22      //let handicap = (startTotalOdd.handicap + '').trim();23      let handicapArray = startTotalOdd.handicap.split(',');24      return parseFloat(startTotalOdd.over_od) <= 1.75 && parseFloat(handicapArray[0]) <= 2.525        || parseFloat(startTotalOdd.over_od) < 1.95 && parseFloat(handicapArray[0]) > 326        || parseFloat(startTotalOdd.over_od) < 1.85 && parseInt(handicapArray[0]) === 327    } else {28      return false29    }30  }31}32function startResultOdd(item) {33  if (item.odds['1_1'] && item.scores ) {34    let resultOdds = item.odds['1_1'];35    let startResultOdd = resultOdds[resultOdds.length - 1];36    if (startResultOdd) {37      if (parseFloat(startResultOdd.home_od) <= 1.4 || parseFloat(startResultOdd.away_od) <= 1.4) {38        return true39      } else {40        return false41      }42    } else {43      return false44    }45  }46}47function leagueName(item) {48  if (item.league && item.league.name) {49    let leagueNameFilter = ['50', '60', '70', '80', 'Women', 'U18', 'U19', 'U20'];50    return item.league.name.indexOf(leagueNameFilter[0]) === -151      && item.league.name.indexOf(leagueNameFilter[1]) === -152      && item.league.name.indexOf(leagueNameFilter[2]) === -153      && item.league.name.indexOf(leagueNameFilter[3]) === -154      && item.league.name.indexOf(leagueNameFilter[4]) === -155      && item.league.name.indexOf(leagueNameFilter[5]) === -156      && item.league.name.indexOf(leagueNameFilter[6]) === -157      && item.league.name.indexOf(leagueNameFilter[7]) === -158  }59}60function attacksBot3(item) {61  if (item.view && item.view.stats && item.view.stats.on_target && item.view.stats.attacks && item.view.stats.dangerous_attacks) {62    let goalsOnTarget = 0;63    goalsOnTarget = parseInt(item.view.stats.on_target[0]) + parseInt(item.view.stats.on_target[1]);64    let attacksSumm = 0;65    attacksSumm = parseInt(item.view.stats.attacks[0]) + parseInt(item.view.stats.attacks[1]);66    let dangerAttacksSumm = 0;67    dangerAttacksSumm = parseInt(item.view.stats.dangerous_attacks[0]) + parseInt(item.view.stats.dangerous_attacks[1]);68    return goalsOnTarget >= 3 && attacksSumm >= 38 && dangerAttacksSumm/attacksSumm >= 0.569  } else {70    return false71  }72}73function attacksBot2(item) {74  if (item.view && item.view.stats && item.view.stats.on_target  && item.view.stats.off_target && item.view.stats.attacks && item.view.stats.dangerous_attacks) {75    let goalsOnTarget = 0;76    goalsOnTarget = parseInt(item.view.stats.on_target[0]) + parseInt(item.view.stats.on_target[1]);77    let attacksSumm = 0;78    attacksSumm = parseInt(item.view.stats.attacks[0]) + parseInt(item.view.stats.attacks[1]);79    let dangerAttacksSumm = 0;80    dangerAttacksSumm = parseInt(item.view.stats.dangerous_attacks[0]) + parseInt(item.view.stats.dangerous_attacks[1]);81    let allGoals = 0;82    allGoals = goalsOnTarget + parseInt(item.view.stats.off_target[0]) + parseInt(item.view.stats.off_target[1]);83    let dangerAttacksDiff = Math.abs(parseInt(item.view.stats.dangerous_attacks[0]) - parseInt(item.view.stats.dangerous_attacks[1]));84    let dangerAttacksKef;85    if (parseInt(item.view.stats.dangerous_attacks[0]) >= parseInt(item.view.stats.dangerous_attacks[1])) {86      dangerAttacksKef = parseInt(item.view.stats.attacks[0])/parseInt(item.view.stats.dangerous_attacks[0])87    } else {88      dangerAttacksKef = parseInt(item.view.stats.attacks[1])/parseInt(item.view.stats.dangerous_attacks[1])89    }90    let favoriteDangerAttacksKef;91    if (parseInt(item.view.stats.dangerous_attacks[0]) > parseInt(item.view.stats.dangerous_attacks[1])) {92      favoriteDangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[0])/parseInt(item.view.stats.dangerous_attacks[1]);93    } else {94      favoriteDangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[1])/parseInt(item.view.stats.dangerous_attacks[0]);95    }96    return goalsOnTarget >= 1 && allGoals >= 4 && (item.view.stats.dangerous_attacks[0] <= 10 || item.view.stats.dangerous_attacks[1] <= 10)97      && favoriteDangerAttacksKef >= 2.298  } else {99    return false100  }101}102function attacksBot1(item) {103  if (item.view && item.view.stats && item.view.stats.on_target && item.view.stats.attacks && item.view.stats.dangerous_attacks) {104    let goalsOnTarget = 0;105    goalsOnTarget = parseInt(item.view.stats.on_target[0]) + parseInt(item.view.stats.on_target[1]);106    let attacksSumm = 0;107    attacksSumm = parseInt(item.view.stats.attacks[0]) + parseInt(item.view.stats.attacks[1]);108    let dangerAttacksSumm = 0;109    dangerAttacksSumm = parseInt(item.view.stats.dangerous_attacks[0]) + parseInt(item.view.stats.dangerous_attacks[1]);110    let dangerAttacksDif = Math.abs(parseInt(item.view.stats.dangerous_attacks[0]) - parseInt(item.view.stats.dangerous_attacks[1]));111    let dangerAttacksKef;112    if (parseInt(item.view.stats.dangerous_attacks[0]) > parseInt(item.view.stats.dangerous_attacks[1])) {113      dangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[0])/parseInt(item.view.stats.dangerous_attacks[1]);114    } else {115      dangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[1])/parseInt(item.view.stats.dangerous_attacks[0]);116    }117    return dangerAttacksDif >= 10 && goalsOnTarget >= 3118  } else {119    return false120  }121}122function attacksBotTM(item) {123  if (item.view && item.view.stats && item.view.stats.on_target && item.view.stats.attacks && item.view.stats.dangerous_attacks) {124    let goalsOnTarget = 0;125    goalsOnTarget = parseInt(item.view.stats.on_target[0]) + parseInt(item.view.stats.on_target[1]);126    let goalsOffTarget = 0;127    goalsOffTarget = parseInt(item.view.stats.off_target[0]) + parseInt(item.view.stats.off_target[1]);128    let attacksSumm = 0;129    attacksSumm = parseInt(item.view.stats.attacks[0]) + parseInt(item.view.stats.attacks[1]);130    let dangerAttacksSumm = 0;131    dangerAttacksSumm = parseInt(item.view.stats.dangerous_attacks[0]) + parseInt(item.view.stats.dangerous_attacks[1]);132    let dangerAttacksDif = Math.abs(parseInt(item.view.stats.dangerous_attacks[0]) - parseInt(item.view.stats.dangerous_attacks[1]));133    let dangerAttacksKef;134    if (parseInt(item.view.stats.dangerous_attacks[0]) > parseInt(item.view.stats.dangerous_attacks[1])) {135      dangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[0])/parseInt(item.view.stats.dangerous_attacks[1]);136    } else {137      dangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[1])/parseInt(item.view.stats.dangerous_attacks[0]);138    }139    return dangerAttacksKef >= 2.3140  } else {141    return false142  }143}144function attacksBotCorporation(item) {145  if (item.view && item.view.stats && item.view.stats.on_target && item.view.stats.attacks && item.view.stats.dangerous_attacks) {146    let goalsOnTarget = 0;147    goalsOnTarget = parseInt(item.view.stats.on_target[0]) + parseInt(item.view.stats.on_target[1]);148    let goalsOnTargetDiff = 0;149    goalsOnTargetDiff = Math.abs(parseInt(item.view.stats.on_target[0]) - parseInt(item.view.stats.on_target[1]));150    let goalsOffTarget = 0;151    goalsOffTarget = parseInt(item.view.stats.off_target[0]) + parseInt(item.view.stats.off_target[1]);152    let attacksSumm = 0;153    attacksSumm = parseInt(item.view.stats.attacks[0]) + parseInt(item.view.stats.attacks[1]);154    let dangerAttacksSumm = 0;155    dangerAttacksSumm = parseInt(item.view.stats.dangerous_attacks[0]) + parseInt(item.view.stats.dangerous_attacks[1]);156    let dangerAttacksDif = Math.abs(parseInt(item.view.stats.dangerous_attacks[0]) - parseInt(item.view.stats.dangerous_attacks[1]));157    let dangerAttacksKef;158    if (parseInt(item.view.stats.dangerous_attacks[0]) > parseInt(item.view.stats.dangerous_attacks[1])) {159      dangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[0])/parseInt(item.view.stats.dangerous_attacks[1]);160    } else {161      dangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[1])/parseInt(item.view.stats.dangerous_attacks[0]);162    }163    return goalsOnTarget >= 3 && goalsOnTargetDiff >= 2 && (goalsOffTarget + goalsOnTarget) >= 5 && dangerAttacksDif >= 9;164  } else {165    return false166  }167}168function attacks(item) {169  //return item.view && item.view.stats && item.view.stats.on_target && item.view.stats.attacks && item.view.stats.dangerous_attacks170  if (item.view && item.view.stats && item.view.stats.on_target && item.view.stats.attacks && item.view.stats.dangerous_attacks && item.odds['1_1'] && parseFloat(item.odds['1_1'][0].home_od) > 1) {171    /*let goalsOnTarget = 0;172    goalsOnTarget = parseInt(item.view.stats.on_target[0]) + parseInt(item.view.stats.on_target[1]);173    let goalsOffTarget = 0;174    goalsOffTarget = parseInt(item.view.stats.off_target[0]) + parseInt(item.view.stats.off_target[1]);175    let team1AllGoals = 0;176    team1AllGoals = parseInt(item.view.stats.on_target[0]) + parseInt(item.view.stats.off_target[0]);177    let team2AllGoals = 0;178    team2AllGoals = parseInt(item.view.stats.on_target[1]) + parseInt(item.view.stats.off_target[1]);179    let attacksSumm = 0;180    attacksSumm = parseInt(item.view.stats.attacks[0]) + parseInt(item.view.stats.attacks[1]);181    let dangerAttacksSumm = 0182    dangerAttacksSumm = parseInt(item.view.stats.dangerous_attacks[0]) + parseInt(item.view.stats.dangerous_attacks[1]);183    let dangerAttacksDif = Math.abs(parseInt(item.view.stats.dangerous_attacks[0]) - parseInt(item.view.stats.dangerous_attacks[1]));184    let attacksKef = attacksSumm/dangerAttacksSumm;*/185    let dangerAttacksSumm = 0;186    dangerAttacksSumm = parseInt(item.view.stats.dangerous_attacks[0]) + parseInt(item.view.stats.dangerous_attacks[1]);187    let dangerAttacksKef;188    let advantageTeam = '';189    let dangerAttacksDiff = Math.abs(parseInt(item.view.stats.dangerous_attacks[0]) - parseInt(item.view.stats.dangerous_attacks[1]));190    let attacksDiff;191    if (parseInt(item.view.stats.dangerous_attacks[0]) > parseInt(item.view.stats.dangerous_attacks[1])) {192      dangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[0])/parseInt(item.view.stats.dangerous_attacks[1]);193      attacksDiff = parseInt(item.view.stats.attacks[0]) - parseInt(item.view.stats.attacks[1]);194      advantageTeam = 'home'195    } else {196      dangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[1])/parseInt(item.view.stats.dangerous_attacks[0]);197      attacksDiff = parseInt(item.view.stats.attacks[1]) - parseInt(item.view.stats.attacks[0]);198      advantageTeam = 'away'199    }200    let resultOdds = item.odds['1_1'];201    let startResultOdd = resultOdds[resultOdds.length - 1];202    let oddsKef = parseFloat(startResultOdd.home_od)/parseFloat(startResultOdd.away_od);203    let attacksRatioKefHome;204    let attacksRatioKefAway;205    if (parseInt(item.view.stats.attacks[0]) > parseInt(item.view.stats.attacks[1])) {206      attacksRatioKefHome = parseInt(item.view.stats.attacks[0])/parseInt(item.view.stats.attacks[1]);207    } else {208      attacksRatioKefAway = parseInt(item.view.stats.attacks[1])/parseInt(item.view.stats.attacks[0]);209    }210    //СÑÐ¿ÐµÑ Ð±Ð¾Ñ211    return ((dangerAttacksKef >= 3.2 && advantageTeam === 'home' || dangerAttacksKef >= 1.2 && dangerAttacksKef <= 1.5 && advantageTeam === 'away') && dangerAttacksDiff >= 3 && oddsKef >= 0.5 && oddsKef <= 1.2)212    //Ñедди213    //return (advantageTeam === 'away' && dangerAttacksDiff >= 3 && attacksRatioKefAway >= 1.2 && oddsKef >= 0.3 && oddsKef <= 1.2 && dangerAttacksSumm >= 18)214  } else {215    return false216  }217}218function trendAttacks(item) {219  //return item.view && item.view.stats && item.view.stats.on_target && item.view.stats.attacks && item.view.stats.dangerous_attacks220  if (item.trends && item.trends.dangerous_attacks) {221    let homeDangerAttacks;222    let awayDangerAttacks;223    let home45 = _.find(item.trends.dangerous_attacks.home, function(item) {224      return item.time_str === '65'225    })226    let home64 = _.find(item.trends.dangerous_attacks.home, function(item) {227      return item.time_str === '79'228    })229    let away45 = _.find(item.trends.dangerous_attacks.away, function(item) {230      return item.time_str === '65'231    })232    let away64 = _.find(item.trends.dangerous_attacks.away, function(item) {233      return item.time_str === '79'234    })235    if (home45 && home64 && away45 && away64) {236      homeDangerAttacks = home64.val - home45.val;237      awayDangerAttacks = away64.val - away45.val;238      let dangerAttacksKef;239      if (homeDangerAttacks > awayDangerAttacks) {240        dangerAttacksKef = homeDangerAttacks/awayDangerAttacks241      } else {242        dangerAttacksKef = awayDangerAttacks/homeDangerAttacks243      }244      return (dangerAttacksKef >= 1.5)245    } else {246      return false247    }248  } else {249    return false250  }251}252function mapTrendAttacks(item) {253  //return item.view && item.view.stats && item.view.stats.on_target && item.view.stats.attacks && item.view.stats.dangerous_attacks254  if (item.trends && item.trends.dangerous_attacks) {255    let homeDangerAttacks;256    let awayDangerAttacks;257    let home45 = _.find(item.trends.dangerous_attacks.home, function(item) {258      return item.time_str === '65'259    })260    let home64 = _.find(item.trends.dangerous_attacks.home, function(item) {261      return item.time_str === '79'262    })263    let away45 = _.find(item.trends.dangerous_attacks.away, function(item) {264      return item.time_str === '65'265    })266    let away64 = _.find(item.trends.dangerous_attacks.away, function(item) {267      return item.time_str === '79'268    })269    if (home45 && home64 && away45 && away64) {270      homeDangerAttacks = home64.val - home45.val;271      awayDangerAttacks = away64.val - away45.val;272      item.homeDangerAttacks = homeDangerAttacks;273      item.awayDangerAttacks = awayDangerAttacks;274      return item275    } else {276      return false277    }278  } else {279    return false280  }281}282function currentWinner(item) {283  if (item.odds['1_1'] && parseFloat(item.odds['1_1'][0].home_od) > 1) {284    let winnerOdds = item.odds['1_1'];285    let currentWinnerOdd = winnerOdds[0];286    let dangerAttacksKef = parseInt(item.view.stats.dangerous_attacks[0])/parseInt(item.view.stats.dangerous_attacks[1]);287    if (dangerAttacksKef > 1) {288      if (parseFloat(currentWinnerOdd.home_od) >= 1.8 && parseFloat(currentWinnerOdd.home_od) <= 5) {289        return true290      } else {291        return false292      }293    } else {294      if (parseFloat(currentWinnerOdd.away_od) >= 1.8 && parseFloat(currentWinnerOdd.away_od) <= 5 ) {295        return true296      } else {297        return false298      }299    }300    /*if (parseInt(item.view.stats.dangerous_attacks[0]) > parseInt(item.view.stats.dangerous_attacks[1])) {301      if (parseFloat(currentWinnerOdd.home_od) >= 1.8 && parseFloat(currentWinnerOdd.home_od) <= 2.8) {302        return true303      } else {304        return false305      }306    } else {307      if (parseFloat(currentWinnerOdd.away_od) >= 1.8 && parseFloat(currentWinnerOdd.away_od) <= 2.8) {308        return true309      } else {310        return false311      }312    }*/313  }314}315function halfTimeWinnerOdds(item) {316  //return true317  if (item.odds['1_8'] && item.odds['1_8'][0] && parseFloat(item.odds['1_8'][0].draw_od) > 1) {318    //return true319    let winnerOdds = item.odds['1_8'];320    let currentWinnerOdd = winnerOdds[0];321    if (parseFloat(currentWinnerOdd.draw_od) >= 1.75) {322      return true323    } else {324      return false325    }326    /*if (parseInt(item.view.stats.dangerous_attacks[0]) > parseInt(item.view.stats.dangerous_attacks[1])) {327      if (parseFloat(currentWinnerOdd.home_od) >= 1.8 && parseFloat(currentWinnerOdd.home_od) <= 2.8) {328        return true329      } else {330        return false331      }332    } else {333      if (parseFloat(currentWinnerOdd.away_od) >= 1.8 && parseFloat(currentWinnerOdd.away_od) <= 2.8) {334        return true335      } else {336        return false337      }338    }*/339  }340}341function favoriteLoses(item) {342  if (item.view.scores && item.view.scores['2'] && item.odds['1_1'] && parseFloat(item.odds['1_1'][0].home_od) > 1) {343    if (parseFloat(item.odds['1_1'][0].home_od) < 2 && item.view.scores['2'].home < item.view.scores['2'].away) {344      return true345    } else if (parseFloat(item.odds['1_1'][0].away_od) < 2 && item.view.scores['2'].home > item.view.scores['2'].away) {346      return true347    }348  } else {349    return false350  }351}352function currentTB1stHalf(item) {353  if (item.odds && item.odds['1_6'] && item.odds['1_6']['0']) {354    if (item.odds['1_6']['0'].over_od <= 1.95) {355      return true;356    } else {357      return false358    }359  } else {360    return false361  }362}363export const filterFunctions = {364  startTB: startTB,365  leagueName: leagueName,366  attacksBot1: attacksBot1,367  attacksBot2: attacksBot2,368  attacksBot3: attacksBot3,369  attacksBotCorporation: attacksBotCorporation,370  totalGoals: totalGoals,371  attacks: attacks,372  currentWinner: currentWinner,373  startResultOdd: startResultOdd,374  halfTimeWinnerOdds: halfTimeWinnerOdds,375  favoriteLoses: favoriteLoses,376  currentTB1stHalf: currentTB1stHalf,377  goalsDraw: goalsDraw,378  trendAttacks: trendAttacks,379  mapTrendAttacks: mapTrendAttacks,380  attacksBotTM: attacksBotTM...stats.js
Source:stats.js  
1/*2 *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.3 *4 *  Use of this source code is governed by a BSD-style license5 *  that can be found in the LICENSE file in the root of the source6 *  tree.7 */8/* More information about these options at jshint.com/docs/options */9/* exported computeBitrate, computeE2EDelay, computeRate,10   enumerateStats, extractStatAsInt, refreshStats */11'use strict';12// Return the integer stat |statName| from the object with type |statObj| in13// |stats|, or null if not present.14function extractStatAsInt(stats, statObj, statName) {15  // Ignore stats that have a 'nullish' value.16  // The correct fix is indicated in17  // https://code.google.com/p/webrtc/issues/detail?id=3377.18  var str = extractStat(stats, statObj, statName);19  if (str) {20    var val = parseInt(str);21    if (val !== -1) {22      return val;23    }24  }25  return null;26}27// Return the stat |statName| from the object with type |statObj| in |stats|28// as a string, or null if not present.29function extractStat(stats, statObj, statName) {30  var report = getStatsReport(stats, statObj, statName);31  if (report && report[statName] !== -1) {32    return report[statName];33  }34  return null;35}36// Return the stats report with type |statObj| in |stats|, with the stat37// |statName| (if specified), and value |statVal| (if specified). Return38// undef if not present.39function getStatsReport(stats, statObj, statName, statVal) {40  var result = null;41  if (stats) {42    stats.forEach(function(report, stat) {43      if (report.type === statObj) {44        var found = true;45        // If |statName| is present, ensure |report| has that stat.46        // If |statVal| is present, ensure the value matches.47        if (statName) {48          var val = statName === 'id' ? report.id : report[statName];49          found = (statVal !== undefined) ? (val === statVal) : val;50        }51        if (found) {52          result = report;53        }54      }55    });56  }57  return result;58}59// Enumerates the new standard compliant stats using local and remote track ids.60function enumerateStats(stats, localTrackIds, remoteTrackIds) {61  // Create an object structure with all the needed stats and types that we care62  // about. This allows to map the getStats stats to other stats names.63  var statsObject = {64    audio: {65      local: {66        audioLevel: 0.0,67        bytesSent: 0,68        clockRate: 0,69        codecId: '',70        mimeType: '',71        packetsSent: 0,72        payloadType: 0,73        timestamp: 0.0,74        trackId: '',75        transportId: '',76      },77      remote: {78        audioLevel: 0.0,79        bytesReceived: 0,80        clockRate: 0,81        codecId: '',82        fractionLost: 0,83        jitter: 0,84        mimeType: '',85        packetsLost: 0,86        packetsReceived: 0,87        payloadType: 0,88        timestamp: 0.0,89        trackId: '',90        transportId: '',91      }92    },93    video: {94      local: {95        bytesSent: 0,96        clockRate: 0,97        codecId: '',98        firCount: 0,99        framesEncoded: 0,100        frameHeight: 0,101        framesSent: 0,102        frameWidth: 0,103        nackCount: 0,104        packetsSent: 0,105        payloadType: 0,106        pliCount: 0,107        qpSum: 0,108        timestamp: 0.0,109        trackId: '',110        transportId: '',111      },112      remote: {113        bytesReceived: 0,114        clockRate: 0,115        codecId: '',116        firCount: 0,117        fractionLost: 0,118        frameHeight: 0,119        framesDecoded: 0,120        framesDropped: 0,121        framesReceived: 0,122        frameWidth: 0,123        nackCount: 0,124        packetsLost: 0,125        packetsReceived: 0,126        payloadType: 0,127        pliCount: 0,128        qpSum: 0,129        timestamp: 0.0,130        trackId: '',131        transportId: '',132      }133    },134    connection: {135      availableOutgoingBitrate: 0,136      bytesReceived: 0,137      bytesSent: 0,138      consentRequestsSent: 0,139      currentRoundTripTime: 0.0,140      localCandidateId: '',141      localCandidateType: '',142      localIp: '',143      localPort: 0,144      localPriority: 0,145      localProtocol: '',146      remoteCandidateId: '',147      remoteCandidateType: '',148      remoteIp: '',149      remotePort: 0,150      remotePriority: 0,151      remoteProtocol: '',152      requestsReceived: 0,153      requestsSent: 0,154      responsesReceived: 0,155      responsesSent: 0,156      timestamp: 0.0,157      totalRoundTripTime: 0.0,158    }159  };160  // Need to find the codec, local and remote ID's first.161  if (stats) {162    stats.forEach(function(report, stat) {163      switch(report.type) {164        case 'outbound-rtp':165          if (report.hasOwnProperty('trackId')) {166            if (report.trackId.indexOf(localTrackIds.audio) !== -1) {167              statsObject.audio.local.bytesSent = report.bytesSent;168              statsObject.audio.local.codecId = report.codecId;169              statsObject.audio.local.packetsSent = report.packetsSent;170              statsObject.audio.local.timestamp = report.timestamp;171              statsObject.audio.local.trackId = report.trackId;172              statsObject.audio.local.transportId = report.transportId;173            }174            if (report.trackId.indexOf(localTrackIds.video) !== -1) {175              statsObject.video.local.bytesSent = report.bytesSent;176              statsObject.video.local.codecId = report.codecId;177              statsObject.video.local.firCount = report.firCount;178              statsObject.video.local.framesEncoded = report.frameEncoded;179              statsObject.video.local.framesSent = report.framesSent;180              statsObject.video.local.packetsSent = report.packetsSent;181              statsObject.video.local.pliCount = report.pliCount;182              statsObject.video.local.qpSum = report.qpSum;183              statsObject.video.local.timestamp = report.timestamp;184              statsObject.video.local.trackId = report.trackId;185              statsObject.video.local.transportId = report.transportId;186            }187          }188          break;189        case 'inbound-rtp':190          if (report.hasOwnProperty('trackId')) {191            if(report.trackId.indexOf(remoteTrackIds.audio) !== -1) {192              statsObject.audio.remote.bytesReceived = report.bytesReceived;193              statsObject.audio.remote.codecId = report.codecId;194              statsObject.audio.remote.fractionLost = report.fractionLost;195              statsObject.audio.remote.jitter = report.jitter;196              statsObject.audio.remote.packetsLost = report.packetsLost;197              statsObject.audio.remote.packetsReceived = report.packetsReceived;198              statsObject.audio.remote.timestamp = report.timestamp;199              statsObject.audio.remote.trackId = report.trackId;200              statsObject.audio.remote.transportId = report.transportId;201            }202            if (report.trackId.indexOf(remoteTrackIds.video) !== -1) {203              statsObject.video.remote.bytesReceived = report.bytesReceived;204              statsObject.video.remote.codecId = report.codecId;205              statsObject.video.remote.firCount = report.firCount;206              statsObject.video.remote.fractionLost = report.fractionLost;207              statsObject.video.remote.nackCount = report.nackCount;208              statsObject.video.remote.packetsLost = report.patsLost;209              statsObject.video.remote.packetsReceived = report.packetsReceived;210              statsObject.video.remote.pliCount = report.pliCount;211              statsObject.video.remote.qpSum = report.qpSum;212              statsObject.video.remote.timestamp = report.timestamp;213              statsObject.video.remote.trackId = report.trackId;214              statsObject.video.remote.transportId = report.transportId;215            }216          }217          break;218        case 'candidate-pair':219          if (report.hasOwnProperty('availableOutgoingBitrate')) {220            statsObject.connection.availableOutgoingBitrate =221                report.availableOutgoingBitrate;222            statsObject.connection.bytesReceived = report.bytesReceived;223            statsObject.connection.bytesSent = report.bytesSent;224            statsObject.connection.consentRequestsSent =225                report.consentRequestsSent;226            statsObject.connection.currentRoundTripTime =227                report.currentRoundTripTime;228            statsObject.connection.localCandidateId = report.localCandidateId;229            statsObject.connection.remoteCandidateId = report.remoteCandidateId;230            statsObject.connection.requestsReceived = report.requestsReceived;231            statsObject.connection.requestsSent = report.requestsSent;232            statsObject.connection.responsesReceived = report.responsesReceived;233            statsObject.connection.responsesSent = report.responsesSent;234            statsObject.connection.timestamp = report.timestamp;235            statsObject.connection.totalRoundTripTime =236               report.totalRoundTripTime;237          }238          break;239        default:240          return;241      }242    }.bind());243    // Using the codec, local and remote candidate ID's to find the rest of the244    // relevant stats.245    stats.forEach(function(report) {246      switch(report.type) {247        case 'track':248          if (report.hasOwnProperty('trackIdentifier')) {249            if (report.trackIdentifier.indexOf(localTrackIds.video) !== -1) {250              statsObject.video.local.frameHeight = report.frameHeight;251              statsObject.video.local.framesSent = report.framesSent;252              statsObject.video.local.frameWidth = report.frameWidth;253            }254            if (report.trackIdentifier.indexOf(remoteTrackIds.video) !== -1) {255              statsObject.video.remote.frameHeight = report.frameHeight;256              statsObject.video.remote.framesDecoded = report.framesDecoded;257              statsObject.video.remote.framesDropped = report.framesDropped;258              statsObject.video.remote.framesReceived = report.framesReceived;259              statsObject.video.remote.frameWidth = report.frameWidth;260            }261            if (report.trackIdentifier.indexOf(localTrackIds.audio) !== -1) {262              statsObject.audio.local.audioLevel = report.audioLevel ;263            }264            if (report.trackIdentifier.indexOf(remoteTrackIds.audio) !== -1) {265              statsObject.audio.remote.audioLevel = report.audioLevel;266            }267          }268          break;269        case 'codec':270          if (report.hasOwnProperty('id')) {271            if (report.id.indexOf(statsObject.audio.local.codecId) !== -1) {272              statsObject.audio.local.clockRate = report.clockRate;273              statsObject.audio.local.mimeType = report.mimeType;274              statsObject.audio.local.payloadType = report.payloadType;275            }276            if (report.id.indexOf(statsObject.audio.remote.codecId) !== -1) {277              statsObject.audio.remote.clockRate = report.clockRate;278              statsObject.audio.remote.mimeType = report.mimeType;279              statsObject.audio.remote.payloadType = report.payloadType;280            }281            if (report.id.indexOf(statsObject.video.local.codecId) !== -1) {282              statsObject.video.local.clockRate = report.clockRate;283              statsObject.video.local.mimeType = report.mimeType;284              statsObject.video.local.payloadType = report.payloadType;285            }286            if (report.id.indexOf(statsObject.video.remote.codecId) !== -1) {287              statsObject.video.remote.clockRate = report.clockRate;288              statsObject.video.remote.mimeType = report.mimeType;289              statsObject.video.remote.payloadType = report.payloadType;290            }291          }292          break;293        case 'local-candidate':294          if (report.hasOwnProperty('id')) {295            if (report.id.indexOf(296                statsObject.connection.localCandidateId) !== -1) {297              statsObject.connection.localIp = report.ip;298              statsObject.connection.localPort = report.port;299              statsObject.connection.localPriority = report.priority;300              statsObject.connection.localProtocol = report.protocol;301              statsObject.connection.localType = report.candidateType;302            }303          }304          break;305        case 'remote-candidate':306          if (report.hasOwnProperty('id')) {307            if (report.id.indexOf(308                statsObject.connection.remoteCandidateId) !== -1) {309              statsObject.connection.remoteIp = report.ip;310              statsObject.connection.remotePort = report.port;311              statsObject.connection.remotePriority = report.priority;312              statsObject.connection.remoteProtocol = report.protocol;313              statsObject.connection.remoteType = report.candidateType;314            }315          }316          break;317        default:318          return;319      }320    }.bind());321  }322  return statsObject;323}324// Takes two stats reports and determines the rate based on two counter readings325// and the time between them (which is in units of milliseconds).326function computeRate(newReport, oldReport, statName) {327  var newVal = newReport[statName];328  var oldVal = (oldReport) ? oldReport[statName] : null;329  if (newVal === null || oldVal === null) {330    return null;331  }332  return (newVal - oldVal) / (newReport.timestamp - oldReport.timestamp) * 1000;333}334// Convert a byte rate to a bit rate.335function computeBitrate(newReport, oldReport, statName) {336  return computeRate(newReport, oldReport, statName) * 8;337}338// Computes end to end delay based on the capture start time (in NTP format)339// and the current render time (in seconds since start of render).340function computeE2EDelay(captureStart, remoteVideoCurrentTime) {341  if (!captureStart) {342    return null;343  }344  // Adding offset (milliseconds between 1900 and 1970) to get NTP time.345  var nowNTP = Date.now() + 2208988800000;346  return nowNTP - captureStart - remoteVideoCurrentTime * 1000;...ideologies.js
Source:ideologies.js  
1ideologies = [2    {3        "name": "Anarcho-Communism",4        "stats": {5            "econ": 100,6            "dipl": 50,7            "govt": 100,8            "scty": 909        }10    },11    {12        "name": "Libertarian Communism",13        "stats": {14            "econ": 100,15            "dipl": 70,16            "govt": 80,17            "scty": 8018        }19    },20    {21        "name": "Trotskyism",22        "stats": {23            "econ": 100,24            "dipl": 100,25            "govt": 60,26            "scty": 8027        }28    },29    {30        "name": "Marxism",31        "stats": {32            "econ": 100,33            "dipl": 70,34            "govt": 40,35            "scty": 8036        }37    },38    {39        "name": "De Leonism",40        "stats": {41            "econ": 100,42            "dipl": 30,43            "govt": 30,44            "scty": 8045        }46    },47    {48        "name": "Leninism",49        "stats": {50            "econ": 100,51            "dipl": 40,52            "govt": 20,53            "scty": 7054        }55    },56    {57        "name": "Stalinism/Maoism",58        "stats": {59            "econ": 100,60            "dipl": 20,61            "govt": 0,62            "scty": 6063        }64    },65    {66        "name": "Religious Communism",67        "stats": {68            "econ": 100,69            "dipl": 50,70            "govt": 30,71            "scty": 3072        }73    },74    {75        "name": "State Socialism",76        "stats": {77            "econ": 80,78            "dipl": 30,79            "govt": 30,80            "scty": 7081        }82    },83    {84        "name": "Theocratic Socialism",85        "stats": {86            "econ": 80,87            "dipl": 50,88            "govt": 30,89            "scty": 2090        }91    },92    {93        "name": "Religious Socialism",94        "stats": {95            "econ": 80,96            "dipl": 50,97            "govt": 70,98            "scty": 2099        }100    },101    {102        "name": "Democratic Socialism",103        "stats": {104            "econ": 80,105            "dipl": 50,106            "govt": 50,107            "scty": 80108        }109    },110    {111        "name": "Revolutionary Socialism",112        "stats": {113            "econ": 80,114            "dipl": 20,115            "govt": 50,116            "scty": 70117        }118    },119    {120        "name": "Libertarian Socialism",121        "stats": {122            "econ": 80,123            "dipl": 80,124            "govt": 80,125            "scty": 80126        }127    },128    {129        "name": "Anarcho-Syndicalism",130        "stats": {131            "econ": 80,132            "dipl": 50,133            "govt": 100,134            "scty": 80135        }136    },137    {138        "name": "Left-Wing Populism",139        "stats": {140            "econ": 60,141            "dipl": 40,142            "govt": 30,143            "scty": 70144        }145    },146    {147        "name": "Theocratic Distributism",148        "stats": {149            "econ": 60,150            "dipl": 40,151            "govt": 30,152            "scty": 20153        }154    },155    {156        "name": "Distributism",157        "stats": {158            "econ": 60,159            "dipl": 50,160            "govt": 50,161            "scty": 20162        }163    },164    {165        "name": "Social Liberalism",166        "stats": {167            "econ": 60,168            "dipl": 60,169            "govt": 60,170            "scty": 80171        }172    },173    {174        "name": "Christian Democracy",175        "stats": {176            "econ": 60,177            "dipl": 60,178            "govt": 50,179            "scty": 30180        }181    },182    {183        "name": "Social Democracy",184        "stats": {185            "econ": 60,186            "dipl": 70,187            "govt": 60,188            "scty": 80189        }190    },191    {192        "name": "Progressivism",193        "stats": {194            "econ": 60,195            "dipl": 80,196            "govt": 60,197            "scty": 100198        }199    },200    {201        "name": "Anarcho-Mutualism",202        "stats": {203            "econ": 60,204            "dipl": 50,205            "govt": 100,206            "scty": 70207        }208    },209    {210        "name": "National Totalitarianism",211        "stats": {212            "econ": 50,213            "dipl": 20,214            "govt": 0,215            "scty": 50216        }217    },218    {219        "name": "Global Totalitarianism",220        "stats": {221            "econ": 50,222            "dipl": 80,223            "govt": 0,224            "scty": 50225        }226    },227    {228        "name": "Technocracy",229        "stats": {230            "econ": 60,231            "dipl": 60,232            "govt": 20,233            "scty": 70234        }235    },236    {237        "name": "Centrist",238        "stats": {239            "econ": 50,240            "dipl": 50,241            "govt": 50,242            "scty": 50243        }244    },245    {246        "name": "Liberalism",247        "stats": {248            "econ": 50,249            "dipl": 60,250            "govt": 60,251            "scty": 60252        }253    },254    {255        "name": "Religious Anarchism",256        "stats": {257            "econ": 50,258            "dipl": 50,259            "govt": 100,260            "scty": 20261        }262    },263    {264        "name": "Right-Wing Populism",265        "stats": {266            "econ": 40,267            "dipl": 30,268            "govt": 30,269            "scty": 30270        }271    },272    {273        "name": "Moderate Conservatism",274        "stats": {275            "econ": 40,276            "dipl": 40,277            "govt": 50,278            "scty": 30279        }280    },281    {282        "name": "Reactionary",283        "stats": {284            "econ": 40,285            "dipl": 40,286            "govt": 40,287            "scty": 10288        }289    },290    {291        "name": "Social Libertarianism",292        "stats": {293            "econ": 60,294            "dipl": 70,295            "govt": 80,296            "scty": 70297        }298    },299    {300        "name": "Libertarianism",301        "stats": {302            "econ": 40,303            "dipl": 60,304            "govt": 80,305            "scty": 60306        }307    },308    {309        "name": "Anarcho-Egoism",310        "stats": {311            "econ": 40,312            "dipl": 50,313            "govt": 100,314            "scty": 50315        }316    },317    {318        "name": "Nazism",319        "stats": {320            "econ": 40,321            "dipl": 0,322            "govt": 0,323            "scty": 5324        }325    },326    {327        "name": "Autocracy",328        "stats": {329            "econ": 50,330            "dipl": 20,331            "govt": 20,332            "scty": 50333        }334    },335    {336        "name": "Fascism",337        "stats": {338            "econ": 40,339            "dipl": 20,340            "govt": 20,341            "scty": 20342        }343    },344    {345        "name": "Capitalist Fascism",346        "stats": {347            "econ": 20,348            "dipl": 20,349            "govt": 20,350            "scty": 20351        }352    },353    {354        "name": "Conservatism",355        "stats": {356            "econ": 30,357            "dipl": 40,358            "govt": 40,359            "scty": 20360        }361    },362    {363        "name": "Neo-Liberalism",364        "stats": {365            "econ": 30,366            "dipl": 30,367            "govt": 50,368            "scty": 60369        }370    },371    {372        "name": "Classical Liberalism",373        "stats": {374            "econ": 30,375            "dipl": 60,376            "govt": 60,377            "scty": 80378        }379    },380    {381        "name": "Authoritarian Capitalism",382        "stats": {383            "econ": 20,384            "dipl": 30,385            "govt": 20,386            "scty": 40387        }388    },389    {390        "name": "State Capitalism",391        "stats": {392            "econ": 20,393            "dipl": 50,394            "govt": 30,395            "scty": 50396        }397    },398    {399        "name": "Neo-Conservatism",400        "stats": {401            "econ": 20,402            "dipl": 20,403            "govt": 40,404            "scty": 20405        }406    },407    {408        "name": "Fundamentalism",409        "stats": {410            "econ": 20,411            "dipl": 30,412            "govt": 30,413            "scty": 5414        }415    },416    {417        "name": "Libertarian Capitalism",418        "stats": {419            "econ": 20,420            "dipl": 50,421            "govt": 80,422            "scty": 60423        }424    },425    {426        "name": "Market Anarchism",427        "stats": {428            "econ": 20,429            "dipl": 50,430            "govt": 100,431            "scty": 50432        }433    },434    {435        "name": "Objectivism",436        "stats": {437            "econ": 10,438            "dipl": 50,439            "govt": 90,440            "scty": 40441        }442    },443    {444        "name": "Totalitarian Capitalism",445        "stats": {446            "econ": 0,447            "dipl": 30,448            "govt": 0,449            "scty": 50450        }451    },452    {453        "name": "Ultra-Capitalism",454        "stats": {455            "econ": 0,456            "dipl": 40,457            "govt": 50,458            "scty": 50459        }460    },461    {462        "name": "Anarcho-Capitalism",463        "stats": {464            "econ": 0,465            "dipl": 50,466            "govt": 100,467            "scty": 50468        }469    }
...Compiler-caching.test.js
Source:Compiler-caching.test.js  
1/* globals describe, it */2"use strict";3const path = require("path");4const fs = require("fs");5const rimraf = require("rimraf");6const webpack = require("../");7const WebpackOptionsDefaulter = require("../lib/WebpackOptionsDefaulter");8let fixtureCount = 0;9describe("Compiler (caching)", () => {10	jest.setTimeout(15000);11	function compile(entry, options, callback) {12		options.mode = "none";13		options = new WebpackOptionsDefaulter().process(options);14		options.cache = true;15		options.entry = entry;16		options.optimization.minimize = false;17		options.context = path.join(__dirname, "fixtures");18		options.output.path = "/";19		options.output.filename = "bundle.js";20		options.output.pathinfo = true;21		const logs = {22			mkdirp: [],23			writeFile: []24		};25		const c = webpack(options);26		const files = {};27		c.outputFileSystem = {28			join() {29				return [].join.call(arguments, "/").replace(/\/+/g, "/");30			},31			mkdirp(path, callback) {32				logs.mkdirp.push(path);33				callback();34			},35			writeFile(name, content, callback) {36				logs.writeFile.push(name, content);37				files[name] = content.toString("utf-8");38				callback();39			}40		};41		c.hooks.compilation.tap(42			"CompilerCachingTest",43			compilation => (compilation.bail = true)44		);45		let compilerIteration = 1;46		function runCompiler(options, callback) {47			if (typeof options === "function") {48				callback = options;49				options = {};50			}51			c.run((err, stats) => {52				if (err) throw err;53				expect(typeof stats).toBe("object");54				stats = stats.toJson({55					modules: true,56					reasons: true57				});58				expect(typeof stats).toBe("object");59				expect(stats).toHaveProperty("errors");60				expect(Array.isArray(stats.errors)).toBe(true);61				if (options.expectErrors) {62					expect(stats.errors).toHaveLength(options.expectErrors);63				} else {64					if (stats.errors.length > 0) {65						expect(typeof stats.errors[0]).toBe("string");66						throw new Error(stats.errors[0]);67					}68				}69				stats.logs = logs;70				callback(stats, files, compilerIteration++);71			});72		}73		runCompiler(callback);74		return {75			compilerInstance: c,76			runAgain: runCompiler77		};78	}79	const tempFixturePath = path.join(80		__dirname,81		"fixtures",82		"temp-cache-fixture"83	);84	function cleanup() {85		rimraf.sync(`${tempFixturePath}-*`);86	}87	beforeAll(cleanup);88	afterAll(cleanup);89	function createTempFixture() {90		const fixturePath = `${tempFixturePath}-${fixtureCount}`;91		const aFilepath = path.join(fixturePath, "a.js");92		const cFilepath = path.join(fixturePath, "c.js");93		// Remove previous copy if present94		rimraf.sync(fixturePath);95		// Copy over file since we"ll be modifying some of them96		fs.mkdirSync(fixturePath);97		fs.createReadStream(path.join(__dirname, "fixtures", "a.js")).pipe(98			fs.createWriteStream(aFilepath)99		);100		fs.createReadStream(path.join(__dirname, "fixtures", "c.js")).pipe(101			fs.createWriteStream(cFilepath)102		);103		fixtureCount++;104		return {105			rootPath: fixturePath,106			aFilepath: aFilepath,107			cFilepath: cFilepath108		};109	}110	it("should cache single file (with manual 1s wait) ", done => {111		const options = {};112		const tempFixture = createTempFixture();113		const helper = compile(tempFixture.cFilepath, options, (stats, files) => {114			// Not cached the first time115			expect(stats.assets[0].name).toBe("bundle.js");116			expect(stats.assets[0].emitted).toBe(true);117			helper.runAgain((stats, files, iteration) => {118				// Cached the second run119				expect(stats.assets[0].name).toBe("bundle.js");120				expect(stats.assets[0].emitted).toBe(false);121				const aContent = fs122					.readFileSync(tempFixture.aFilepath)123					.toString()124					.replace("This is a", "This is a MODIFIED");125				setTimeout(() => {126					fs.writeFileSync(tempFixture.aFilepath, aContent);127					helper.runAgain((stats, files, iteration) => {128						// Cached the third run129						expect(stats.assets[0].name).toBe("bundle.js");130						expect(stats.assets[0].emitted).toBe(true);131						done();132					});133				}, 1100);134			});135		});136	});137	it("should cache single file (even with no timeout) ", done => {138		const options = {};139		const tempFixture = createTempFixture();140		const helper = compile(tempFixture.cFilepath, options, (stats, files) => {141			// Not cached the first time142			expect(stats.assets[0].name).toBe("bundle.js");143			expect(stats.assets[0].emitted).toBe(true);144			helper.runAgain((stats, files, iteration) => {145				// Cached the second run146				expect(stats.assets[0].name).toBe("bundle.js");147				expect(stats.assets[0].emitted).toBe(false);148				expect(files["/bundle.js"]).toMatch("This is a");149				const aContent = fs150					.readFileSync(tempFixture.aFilepath)151					.toString()152					.replace("This is a", "This is a MODIFIED");153				fs.writeFileSync(tempFixture.aFilepath, aContent);154				helper.runAgain((stats, files, iteration) => {155					// Cached the third run156					expect(stats.assets[0].name).toBe("bundle.js");157					expect(stats.assets[0].emitted).toBe(true);158					expect(files["/bundle.js"]).toMatch("This is a MODIFIED");159					done();160				});161			});162		});163	});164	it("should only build when modified (with manual 2s wait)", done => {165		const options = {};166		const tempFixture = createTempFixture();167		const helper = compile(tempFixture.cFilepath, options, (stats, files) => {168			// Built the first time169			expect(stats.modules[0].name).toMatch("c.js");170			expect(stats.modules[0].built).toBe(true);171			expect(stats.modules[1].name).toMatch("a.js");172			expect(stats.modules[1].built).toBe(true);173			setTimeout(() => {174				helper.runAgain((stats, files, iteration) => {175					// Not built when cached the second run176					expect(stats.modules[0].name).toMatch("c.js");177					// expect(stats.modules[0].built).toBe(false);178					expect(stats.modules[1].name).toMatch("a.js");179					// expect(stats.modules[1].built).toBe(false);180					const aContent = fs181						.readFileSync(tempFixture.aFilepath)182						.toString()183						.replace("This is a", "This is a MODIFIED");184					setTimeout(() => {185						fs.writeFileSync(tempFixture.aFilepath, aContent);186						helper.runAgain((stats, files, iteration) => {187							// And only a.js built after it was modified188							expect(stats.modules[0].name).toMatch("c.js");189							expect(stats.modules[0].built).toBe(false);190							expect(stats.modules[1].name).toMatch("a.js");191							expect(stats.modules[1].built).toBe(true);192							done();193						});194					}, 2100);195				});196			}, 4100);197		});198	});199	it("should build when modified (even with no timeout)", done => {200		const options = {};201		const tempFixture = createTempFixture();202		const helper = compile(tempFixture.cFilepath, options, (stats, files) => {203			// Built the first time204			expect(stats.modules[0].name).toMatch("c.js");205			expect(stats.modules[0].built).toBe(true);206			expect(stats.modules[1].name).toMatch("a.js");207			expect(stats.modules[1].built).toBe(true);208			helper.runAgain((stats, files, iteration) => {209				// Not built when cached the second run210				expect(stats.modules[0].name).toMatch("c.js");211				// expect(stats.modules[0].built).toBe(false);212				expect(stats.modules[1].name).toMatch("a.js");213				// expect(stats.modules[1].built).toBe(false);214				const aContent = fs215					.readFileSync(tempFixture.aFilepath)216					.toString()217					.replace("This is a", "This is a MODIFIED");218				fs.writeFileSync(tempFixture.aFilepath, aContent);219				helper.runAgain((stats, files, iteration) => {220					// And only a.js built after it was modified221					expect(stats.modules[0].name).toMatch("c.js");222					// expect(stats.modules[0].built).toBe(false);223					expect(stats.modules[1].name).toMatch("a.js");224					expect(stats.modules[1].built).toBe(true);225					done();226				});227			});228		});229	});...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
