text: var expect = require("expect.js")
    , dottie = require('../dottie');
  
  /* If people modify the array prototype Dottie should not be affected */
  Array.prototype.getByName = function(name) {
      for (var i = 0, len = this.length; i < len; i++) {
          if (typeof this[i] != "object") continue;
          if (this[i].name === name) return this[i];
  
      }
  };
  Array.prototype.getByType = function(type) {
      var newvalues = [];
      for (var i = 0, len = this.length; i < len; i++) {
          if (typeof this[i] != "object") continue;
          if (this[i].type === type) newvalues.push(this[i]);
      }
      if (newvalues.length <= 0) newvalues = undefined;
      return newvalues;
  };
  
  describe("dottie.transform", function () {
    it("should create a properly nested object from a basic dottie notated set of keys", function () {
      var values = {
        'user.name': 'John Doe',
        'user.email': 'jd@foobar.com',
        'user.location.country': 'Zanzibar',
        'user.location.city': 'Zanzibar City'
      };
  
      var transformed = dottie.transform(values);
  
      expect(transformed.user).not.to.be(undefined);
      expect(transformed.user.location).not.to.be(undefined);
  
      expect(transformed.user).to.be.an('object');
      expect(transformed.user.location).to.be.an('object');
  
      expect(transformed.user.email).to.equal('jd@foobar.com');
      expect(transformed.user.location.city).to.equal('Zanzibar City');
    });
  
    it("should be able to handle a mixture of nested properties and dottie notated set of keys", function () {
      var values = {
        user: {
          name: 'John Doe'
        },
        'user.email': 'jd@foobar.com',
        'user.location.country': 'Zanzibar',
        'user.location.city': 'Zanzibar City',
        'project.title': 'dottie'
      };
  
      var transformed = dottie.transform(values);
  
      expect(transformed.user).not.to.be(undefined);
      expect(transformed.user.location).not.to.be(undefined);
      expect(transformed.project).not.to.be(undefined);
  
      expect(transformed.user).to.be.an('object');
      expect(transformed.user.location).to.be.an('object');
      expect(transformed.project).to.be.an('object');
  
      expect(transformed.user.email).to.equal('jd@foobar.com');
      expect(transformed.user.location.city).to.equal('Zanzibar City');
      expect(transformed.project.title).to.equal('dottie');
    });
  
    it("should be able to handle base level properties together with nested", function () {
      var values = {
        'customer.name': 'John Doe',
        'customer.age': 15,
        'client': 'Lolcat'
      };
  
      var transformed = dottie.transform(values);
  
      expect(transformed.client).not.to.be(undefined);
      expect(transformed.hasOwnProperty('client')).to.be.ok(); // Ensure that the property is actually on the object itself, not on the prototype.
      expect(transformed.customer).not.to.be(undefined);
  
      expect(transformed.customer).to.be.an('object');
  
      expect(transformed.client).to.equal('Lolcat');
      expect(transformed.customer.name).to.equal('John Doe');
      expect(transformed.customer.age).to.equal(15);
    });
  
    it("should be able to handle null valued properties, not assigning nested level objects", function() {
      var values = {
        'section.id': 20,
        'section.layout': null,
        'section.layout.id': null,
        'section.layout.name': null
      };
  
      var transformed = dottie.transform(values);
  
      expect(transformed.section.layout).to.be(null);
      expect(transformed['section.layout.id']).to.be(undefined);
      expect(transformed['section.layout.name']).to.be(undefined);
    });
  
    it("supports arrays", function () {
      var values = [
        {
          'customer.name': 'John Doe',
          'customer.age': 15,
          'client': 'Lolcat'
        },
        {
          'client.name': 'John Doe',
          'client.age': 15,
          'customer': 'Lolcat'
        }
      ];
  
      var transformed = dottie.transform(values);
      expect(transformed[0].customer.name).to.equal('John Doe');
      expect(transformed[1].client.name).to.equal('John Doe');
    });
  
    it("supports custom delimiters", function () {
      var values = {
        user: {
          name: 'John Doe'
        },
        'user_email': 'jd@foobar.com',
        'user_location_country': 'Zanzibar',
        'user_location_city': 'Zanzibar City',
        'project_title': 'dottie'
      };
  
      var transformed = dottie.transform(values, { delimiter: '_' });
  
      expect(transformed.user).not.to.be(undefined);
      expect(transformed.user.location).not.to.be(undefined);
      expect(transformed.project).not.to.be(undefined);
  
      expect(transformed.user).to.be.an('object');
      expect(transformed.user.location).to.be.an('object');
      expect(transformed.project).to.be.an('object');
  
      expect(transformed.user.email).to.equal('jd@foobar.com');
      expect(transformed.user.location.city).to.equal('Zanzibar City');
      expect(transformed.project.title).to.equal('dottie');
    });
  });
  