text: 'use strict';
  
  var expect = require('expect.js')
    ;
  
  describe('utils', function () {
    describe('random', function () {
      var random = require('../../lib/utils/random');
      describe('string', function () {
        it('should generate unique outputs', function () {
          expect(random.string(8)).not.to.equal(random.string(8));
        });
  
        it('should have the correct length', function () {
          var lengths = [1, 2, 3, 128];
          lengths.forEach(function (len) {
            expect(random.string(len).length).to.equal(len);
          });
        });
      });
  
      describe('numberString', function () {
        it('should have the correct length based on the max', function () {
          expect(random.numberString(10).length).to.equal(1);
          expect(random.numberString(100).length).to.equal(2);
          expect(random.numberString(1000).length).to.equal(3);
          expect(random.numberString(10000).length).to.equal(4);
          expect(random.numberString(100000).length).to.equal(5);
        });
      });
    });
  
    describe('url', function () {
      var urlUtils = require('../../lib/utils/url');
      it('getOrigin', function () {
        expect(urlUtils.getOrigin('http://a.b/')).to.equal('http://a.b:80');
        expect(urlUtils.getOrigin('http://a.b/c')).to.equal('http://a.b:80');
        expect(urlUtils.getOrigin('http://a.b:123/c')).to.equal('http://a.b:123');
        expect(urlUtils.getOrigin('https://a.b/')).to.equal('https://a.b:443');
        expect(urlUtils.getOrigin('file://a.b/')).to.equal(null);
      });
  
      it('isOriginEqual', function () {
        expect(urlUtils.isOriginEqual('http://localhost', 'http://localhost/')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://localhost', 'http://localhost/abc')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://localhost/', 'http://localhost')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://localhost', 'http://localhost')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://localhost', 'http://localhost:8080')).to.not.be.ok();
        expect(urlUtils.isOriginEqual('http://localhost:8080', 'http://localhost')).to.not.be.ok();
        expect(urlUtils.isOriginEqual('http://localhost:8080', 'http://localhost:8080/')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://127.0.0.1:80/', 'http://127.0.0.1:80/a')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://127.0.0.1:80', 'http://127.0.0.1:80/a')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://localhost', 'http://localhost:80')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://127.0.0.1/', 'http://127.0.0.1:80/a')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://127.0.0.1:9', 'http://127.0.0.1:9999')).to.not.be.ok();
        expect(urlUtils.isOriginEqual('http://127.0.0.1:99', 'http://127.0.0.1:9999')).to.not.be.ok();
        expect(urlUtils.isOriginEqual('http://127.0.0.1:999', 'http://127.0.0.1:9999')).to.not.be.ok();
        expect(urlUtils.isOriginEqual('http://127.0.0.1:9999', 'http://127.0.0.1:9999')).to.be.ok();
        expect(urlUtils.isOriginEqual('http://127.0.0.1:99999', 'http://127.0.0.1:9999')).to.not.be.ok();
      });
  
      it('isSchemeEqual', function () {
        expect(urlUtils.isSchemeEqual('http://localhost', 'http://localhost/')).to.be.ok();
        expect(urlUtils.isSchemeEqual('http://localhost', 'https://localhost/')).to.not.be.ok();
        expect(urlUtils.isSchemeEqual('http://localhost', 'file://localhost/')).to.not.be.ok();
      });
    });
  
    describe('escape', function () {
      var escape = require('../../lib/utils/escape');
      describe('quote', function () {
        it('handles empty string', function () {
          expect(escape.quote('')).to.equal('""');
        });
  
        it('handles non-empty string', function () {
          expect(escape.quote('a')).to.equal('"a"');
        });
  
        it('handles tab and newline', function () {
          expect(['"\\t"', '"\\u0009"']).to.contain(escape.quote('\t'));
          expect(['"\\n"', '"\\u000a"']).to.contain(escape.quote('\n'));
        });
  
        it('handles unicode', function () {
          expect(escape.quote('\x00\udfff\ufffe\uffff')).to.equal('"\\u0000\\udfff\\ufffe\\uffff"');
          expect(escape.quote('\ud85c\udff7\ud800\ud8ff')).to.equal('"\\ud85c\\udff7\\ud800\\ud8ff"');
          expect(escape.quote('\u2000\u2001\u0300\u0301')).to.equal('"\\u2000\\u2001\\u0300\\u0301"');
        });
  
        it.skip('handles all 64K characters round-trip', function () {
          var c = [];
          for (var i = 0; i <= 65536; i++) {
            c.push(String.fromCharCode(i));
          }
          var allChars = c.join('');
          expect(JSON.parse(escape.quote(allChars))).to.equal(allChars);
        });
      });
    });
  
    describe('object', function () {
      var objectUtils = require('../../lib/utils/object');
      it('extend', function () {
        var a, b;
        expect(objectUtils.extend({}, {})).to.eql({});
        a = {
          a: 1
        };
        expect(objectUtils.extend(a, {})).to.eql(a);
        expect(objectUtils.extend(a, {
          b: 1
        })).to.eql(a);
        a = {
          a: 1
        };
        b = {
          b: 2
        };
        expect(objectUtils.extend(a, b)).to.eql({
          a: 1,
          b: 2
        });
        expect(a).to.eql({
          a: 1,
          b: 2
        });
        expect(b).to.eql({
          b: 2
        });
      });
    });
  });
  