【大吉大利 今晚吃包】001 - is-sorted

以前看了狼叔的 How-to-learn-node-correctly 這篇文章,獲益匪淺,其中狼叔的 「天天看10個npm模塊」 這句話讓我挺震撼的,當時以爲這怎麼可能,但讀下去才發現若是先從一些小的包入手開始,說不定還真是能夠作到一段時間。

受狼叔影響,決定開此專欄【大吉大利 今晚吃包】不按期更新本人閱讀 npm 模塊源碼的分享,因本人技術水平有限,若有錯誤,還請你們指出,謝謝。node


簡介

最近會先刷小型庫集合裏的包,而今天主要是吃 is-sorted 這個包。git

A small module to check if an Array is sorted.

看簡介咱們知道這是一個判斷數組是否被排序的模塊,這裏貼一下官方例子:github

var sorted = require('is-sorted')
 
console.log(sorted([1, 2, 3]))
// => true
 
console.log(sorted([3, 1, 2]))
// => false
 
// supports custom comparators
console.log(sorted([3, 2, 1], function (a, b) { return b - a })
// => true

目錄結構

目錄結構很簡單,index.js 做爲入口文件,而 test 文件夾下存放測試腳本。npm

主要代碼

/**
 * @param {Array<Number>} array      被檢查的數組
 * @param {Function}      comparator 比較器
 */
module.exports = function checksort (array, comparator) {
  comparator = comparator || defaultComparator

  for (var i = 1, length = array.length; i < length; ++i) {
    if (comparator(array[i - 1], array[i]) > 0) return false
  }

  return true
}

上面的代碼簡而已懂,我也加了文檔註釋,無非就是傳入一個數組和一個比較器,若是沒有傳入比較器就會用默認的升序比較器。json

// 默認的升序比較器
function defaultComparator (a, b) {
  return a - b
}

單元測試

var sorted = require('../')
var fixtures = require('./fixtures')
var tape = require('tape')
var comparators = {
  descending: function (a, b) { return b - a }
}

fixtures.forEach(function (f) {
  tape('returns ' + f.expected + ' for ' + f.array, function (t) {
    t.plan(1)

    var actual = sorted(f.array, comparators[f.comparator])
    t.equal(actual, f.expected)
  })
})

單元測試的腳本很簡單,tap 做爲測試框架,而後把 fixtures 文件裏的測試案例讀取出來,接着即是一一斷言。數組

// fixtures.json
[
  ...
  {
    "array": [1, 2, 3, 4, 6],
    "expected": true
  },
  {
    "array": [5, 4, 3, 1, 1],
    "comparator": "descending",
    "expected": true
  }
  ...
]

總結

這個包只能處理 number 類型的數組,有很大侷限性,不過單元測試那一塊給了我很大啓發。若是要對一個功能進行不少測試的時候,經過相似 json 的這種方式進行測試案例配置,便可以提升工做效率,又能夠減小單元測試的工做量,也算是吃這個包的一個小小收穫。框架

相關文章
相關標籤/搜索