var fullProject = require('./fixtures/full-project')
    fullProjectStr = JSON.stringify(fullProject),
    pbx = require('../lib/pbxProject'),
    pbxFile = require('../lib/pbxFile'),
    proj = new pbx('.');

function cleanHash() {
    return JSON.parse(fullProjectStr);
}

exports.setUp = function (callback) {
    proj.hash = cleanHash();
    callback();
}

var PRODUCT_NAME = '"KitchenSinktablet"';

exports.addAndRemoveToFromHeaderSearchPaths = {
    'add should add the path to each configuration section':function(test) {
        proj.addToHeaderSearchPaths({
            path:'some/path/include'
        });
        var config = proj.pbxXCBuildConfigurationSection();
        for (var ref in config) {
            if (ref.indexOf('_comment') > -1 || config[ref].buildSettings.PRODUCT_NAME != PRODUCT_NAME) continue;
            var lib = config[ref].buildSettings.HEADER_SEARCH_PATHS;
            test.ok(lib[1].indexOf('$(SRCROOT)/KitchenSinktablet/some/path') > -1);
        }
        test.done();
    },
    'add should not mangle string arguments and add to each config section':function(test) {
        var includePath = '../../some/path';
        proj.addToHeaderSearchPaths(includePath);
        var config = proj.pbxXCBuildConfigurationSection();
        for (var ref in config) {
            if (ref.indexOf('_comment') > -1 || config[ref].buildSettings.PRODUCT_NAME != PRODUCT_NAME) continue;
            var lib = config[ref].buildSettings.HEADER_SEARCH_PATHS;
            test.ok(lib[1].indexOf(includePath) > -1);
        }
        test.done();
    },
    'remove should remove from the path to each configuration section':function(test) {
        var libPath = 'some/path/include';
        proj.addToHeaderSearchPaths({
            path:libPath
        });
        proj.removeFromHeaderSearchPaths({
            path:libPath
        });
        var config = proj.pbxXCBuildConfigurationSection();
        for (var ref in config) {
            if (ref.indexOf('_comment') > -1 || config[ref].buildSettings.PRODUCT_NAME != PRODUCT_NAME) continue;
            var lib = config[ref].buildSettings.HEADER_SEARCH_PATHS;
            test.ok(lib.length === 1);
            test.ok(lib[0].indexOf('$(SRCROOT)/KitchenSinktablet/some/path/include') == -1);
        }
        test.done();
    }
}
