var jsonProject = require('./fixtures/full-project') fullProjectStr = JSON.stringify(jsonProject), path = require('path'), pbx = require('../lib/pbxProject'), pbxFile = require('../lib/pbxFile'), proj = new pbx('.'), singleDataModelFilePath = __dirname + '/fixtures/single-data-model.xcdatamodeld', multipleDataModelFilePath = __dirname + '/fixtures/multiple-data-model.xcdatamodeld'; function cleanHash() { return JSON.parse(fullProjectStr); } exports.setUp = function (callback) { proj.hash = cleanHash(); callback(); } exports.dataModelDocument = { 'should return a pbxFile': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath); test.equal(newFile.constructor, pbxFile); test.done() }, 'should set a uuid on the pbxFile': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath); test.ok(newFile.uuid); test.done() }, 'should set a fileRef on the pbxFile': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath); test.ok(newFile.fileRef); test.done() }, 'should set an optional target on the pbxFile': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath, undefined, { target: target }), target = proj.findTargetKey('TestApp'); test.equal(newFile.target, target); test.done() }, 'should populate the PBXBuildFile section with 2 fields': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath), buildFileSection = proj.pbxBuildFileSection(), bfsLength = Object.keys(buildFileSection).length; test.equal(59 + 1, bfsLength); test.ok(buildFileSection[newFile.uuid]); test.ok(buildFileSection[newFile.uuid + '_comment']); test.done(); }, 'should populate the PBXFileReference section with 2 fields for single model document': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath), fileRefSection = proj.pbxFileReferenceSection(), frsLength = Object.keys(fileRefSection).length; test.equal(66 + 2, frsLength); test.ok(fileRefSection[newFile.models[0].fileRef]); test.ok(fileRefSection[newFile.models[0].fileRef + '_comment']); test.done(); }, 'should populate the PBXFileReference section with 2 fields for each model of a model document': function (test) { var newFile = proj.addDataModelDocument(multipleDataModelFilePath), fileRefSection = proj.pbxFileReferenceSection(), frsLength = Object.keys(fileRefSection).length; test.equal(66 + 2 * 2, frsLength); test.ok(fileRefSection[newFile.models[0].fileRef]); test.ok(fileRefSection[newFile.models[0].fileRef + '_comment']); test.ok(fileRefSection[newFile.models[1].fileRef]); test.ok(fileRefSection[newFile.models[1].fileRef + '_comment']); test.done(); }, 'should add to resources group by default': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath); groupChildren = proj.pbxGroupByName('Resources').children, found = false; for (var index in groupChildren) { if (groupChildren[index].comment === 'single-data-model.xcdatamodeld') { found = true; break; } } test.ok(found); test.done(); }, 'should add to group specified by key': function (test) { var group = 'Frameworks', newFile = proj.addDataModelDocument(singleDataModelFilePath, proj.findPBXGroupKey({ name: group })); groupChildren = proj.pbxGroupByName(group).children; var found = false; for (var index in groupChildren) { if (groupChildren[index].comment === path.basename(singleDataModelFilePath)) { found = true; break; } } test.ok(found); test.done(); }, 'should add to group specified by name': function (test) { var group = 'Frameworks', newFile = proj.addDataModelDocument(singleDataModelFilePath, group); groupChildren = proj.pbxGroupByName(group).children; var found = false; for (var index in groupChildren) { if (groupChildren[index].comment === path.basename(singleDataModelFilePath)) { found = true; break; } } test.ok(found); test.done(); }, 'should add to the PBXSourcesBuildPhase': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath), sources = proj.pbxSourcesBuildPhaseObj(); test.equal(sources.files.length, 2 + 1); test.done(); }, 'should create a XCVersionGroup section': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath), xcVersionGroupSection = proj.xcVersionGroupSection(); test.ok(xcVersionGroupSection[newFile.fileRef]); test.done(); }, 'should populate the XCVersionGroup comment correctly': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath), xcVersionGroupSection = proj.xcVersionGroupSection(), commentKey = newFile.fileRef + '_comment'; test.equal(xcVersionGroupSection[commentKey], path.basename(singleDataModelFilePath)); test.done(); }, 'should add the XCVersionGroup object correctly': function (test) { var newFile = proj.addDataModelDocument(singleDataModelFilePath), xcVersionGroupSection = proj.xcVersionGroupSection(), xcVersionGroupEntry = xcVersionGroupSection[newFile.fileRef]; test.equal(xcVersionGroupEntry.isa, 'XCVersionGroup'); test.equal(xcVersionGroupEntry.children[0], newFile.models[0].fileRef); test.equal(xcVersionGroupEntry.currentVersion, newFile.currentModel.fileRef); test.equal(xcVersionGroupEntry.name, path.basename(singleDataModelFilePath)); // Need to validate against normalized path, since paths should contain forward slash on OSX test.equal(xcVersionGroupEntry.path, singleDataModelFilePath.replace(/\\/g, '/')); test.equal(xcVersionGroupEntry.sourceTree, '""'); test.equal(xcVersionGroupEntry.versionGroupType, 'wrapper.xcdatamodel'); test.done(); } }