var vows = require(“vows”),

_ = require("../../"),
load = require("../load"),
assert = require("../assert");

var suite = vows.describe(“d3.scale.category”);

suite.addBatch({

"category": {
  topic: load("scale/category").expression("d3.scale"),
  "category10": category("category10", 10),
  "category20": category("category20", 20),
  "category20b": category("category20b", 20),
  "category20c": category("category20c", 20)
}

});

function category(category, n) {

return {
  "is an ordinal scale": function(scale) {
    var x = scale[category](), colors = x.range();
    assert.lengthOf(x.domain(), 0);
    assert.lengthOf(x.range(), n);
    assert.equal(x(1), colors[0]);
    assert.equal(x(2), colors[1]);
    assert.equal(x(1), colors[0]);
    var y = x.copy();
    assert.deepEqual(y.domain(), x.domain());
    assert.deepEqual(y.range(), x.range());
    x.domain(_.range(n));
    for (var i = 0; i < n; ++i) assert.equal(x(i + n), x(i));
    assert.equal(y(1), colors[0]);
    assert.equal(y(2), colors[1]);
  },
  "each instance is isolated": function(scale) {
    var a = scale[category](), b = scale[category](), colors = a.range();
    assert.equal(a(1), colors[0]);
    assert.equal(b(2), colors[0]);
    assert.equal(b(1), colors[1]);
    assert.equal(a(1), colors[0]);
  },
  "contains the expected number of values in the range": function(scale) {
    var x = scale[category]();
    assert.lengthOf(x.range(), n);
  },
  "each range value is distinct": function(scale) {
    var map = {}, count = 0, x = scale[category]();
    x.range().forEach(function(v) {
      if (!(v in map)) {
        map[v] = ++count;
      }
    });
    assert.equal(count, x.range().length);
  },
  "each range value is a hexadecimal color": function(scale) {
    var x = scale[category]();
    x.range().forEach(function(v) {
      assert.match(v, /#[0-9a-f]{6}/);
      v = _.rgb(v);
      assert.isFalse(isNaN(v.r));
      assert.isFalse(isNaN(v.g));
      assert.isFalse(isNaN(v.b));
    });
  },
  "no range values are very dark or very light": function(scale) {
    var x = scale[category]();
    x.range().forEach(function(v) {
      var c = _.hsl(v);
      assert.isTrue(c.l >= .34, "expected " + v + " to be lighter (l = " + c.l + ")");
      assert.isTrue(c.l <= .89, "expected " + v + " to be darker (l = " + c.l + ")");
    });
  }
};

}

suite.export(module);