Skip to content

Commit

Permalink
Cleaned up test suite to pass on both ObjC & Swift
Browse files Browse the repository at this point in the history
  • Loading branch information
justin committed Mar 26, 2016
1 parent 9302f55 commit ef94b75
Show file tree
Hide file tree
Showing 12 changed files with 149 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@
79F9CEC1196F146600D9BF82 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0730;
LastUpgradeCheck = 0600;
ORGANIZATIONNAME = "Jonathan 'Wolf' Rentzsch";
TargetAttributes = {
Expand Down
26 changes: 23 additions & 3 deletions test/Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ end
#==============================
OSX_SDK="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk"
OSX_VERSION="10.11"
LINKED_FRAMEWORKS="-framework Foundation -framework Cocoa -framework CoreData"
LINKED_FRAMEWORKS="-framework Foundation -framework AppKit -framework CoreData"

BUILD_SETTINGS = run_or_die 'xcodebuild -project ../mogenerator.xcodeproj -configuration Debug -showBuildSettings'
BUILT_PRODUCTS_DIR = BUILD_SETTINGS.lines.select{|line|line[/\sBUILT_PRODUCTS_DIR\s/]}[0].strip.sub('BUILT_PRODUCTS_DIR = ','')
Expand All @@ -30,24 +30,44 @@ def gen_and_compile_objc(desc, mogenPath, extra_mogen_args, extra_llvm_args)
puts "*** Testing #{desc}"
ENV['MOMC_NO_INVERSE_RELATIONSHIP_WARNINGS'] = '1'
run_or_die "#{mogenPath.gsub(/ /, '\\ ')} --model test.xcdatamodel --output MOs --baseClass MyBaseClass #{extra_mogen_args}"
run_or_die 'cp ./objc/HumanMO.* ./objc/Gender.* ./objc/MyProtocol.* ./objc/MyBaseClass.* MOs'
run_or_die "clang -o testbin ./objc/test.m ./objc/TestProtocol.m MOs/*.m -I\"#{Dir.pwd}\" #{LINKED_FRAMEWORKS} -fmodules -isysroot #{OSX_SDK} -mmacosx-version-min=#{OSX_VERSION} -fobjc-arc #{extra_llvm_args}"
run_or_die 'cp ./objc/Gender.* ./objc/MyBaseClass.* MOs'
run_or_die "clang -o testbin ./objc/test.m MOs/*.m -I\"#{Dir.pwd}\" #{LINKED_FRAMEWORKS} -fmodules -isysroot #{OSX_SDK} -mmacosx-version-min=#{OSX_VERSION} -fobjc-arc #{extra_llvm_args}"
run_or_die "xcrun momc -MOMC_NO_INVERSE_RELATIONSHIP_WARNINGS test.xcdatamodel \"#{Dir.pwd}/test.mom\""
puts run_or_die './testbin'
end

def gen_and_compile_swift(desc, mogenPath, extra_mogen_args, extra_llvm_args)
puts "*** Testing #{desc}"
ENV['MOMC_NO_INVERSE_RELATIONSHIP_WARNINGS'] = '1'
run_or_die "#{mogenPath.gsub(/ /, '\\ ')} --swift --model test.xcdatamodel --output MOs --baseClass MyBaseClass #{extra_mogen_args}"
run_or_die 'cp ./swift/Gender.swift ./swift/MyBaseClass.swift MOs'
run_or_die "swiftc -o testbin ./swift/main.swift MOs/*.swift -sdk #{OSX_SDK} #{LINKED_FRAMEWORKS}"
run_or_die "xcrun momc -MOMC_NO_INVERSE_RELATIONSHIP_WARNINGS test.xcdatamodel \"#{Dir.pwd}/test.mom\""
puts run_or_die './testbin'
end


desc 'Generate, Compile and Run Objective-C'
task :objc do
Rake::Task[:clean].execute
gen_and_compile_objc('Objective-C', MOGENERATOR_PATH, '', '')
Rake::Task[:clean].execute
end

desc 'Generate, Compile and Run Swift'
task :swift do
Rake::Task[:clean].execute
gen_and_compile_swift('Swift', MOGENERATOR_PATH, '', '')
Rake::Task[:clean].execute
end


desc 'Clean output'
task :clean do
run_or_die 'rm -rf MOs testbin test.mom'
end

task :default do
Rake::Task[:objc].execute
Rake::Task[:swift].execute
end
9 changes: 0 additions & 9 deletions test/objc/HumanMO.h

This file was deleted.

15 changes: 0 additions & 15 deletions test/objc/HumanMO.m

This file was deleted.

4 changes: 0 additions & 4 deletions test/objc/MyProtocol.h

This file was deleted.

7 changes: 0 additions & 7 deletions test/objc/TestProtocol.h

This file was deleted.

8 changes: 0 additions & 8 deletions test/objc/TestProtocol.m

This file was deleted.

4 changes: 0 additions & 4 deletions test/objc/test.m
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#import "../MOs/MyBaseClass.h"
#import "../MOs/ParentMO.h"
#import "../MOs/ChildMO.h"
#import "TestProtocol.h"
#import "../MOs/Gender.h"

int main(int argc, char *argv[]) {
Expand Down Expand Up @@ -61,9 +60,6 @@ int main(int argc, char *argv[]) {
lisa.humanName = lisa.childName = @"lisa";
[lisa setIvar:1.0];

ParentMO *protocolMO = [ParentMO insertInManagedObjectContext:moc];
protocolMO.myTransformableWithProtocol = [TestProtocol new];

//--

NSError *saveError = nil;
Expand Down
53 changes: 53 additions & 0 deletions test/swift/Gender.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@

// Mostly stolen from http://abcnewsgocom/blogs/headlines/2014/02/heres-a-list-of-58-gender-options-for-facebook-users/
enum Gender: Int32 {
case Undefined = 0,
Female,
Male,
Other,
Agender,
Androgyne,
Androgynous,
Bigender,
Cisgender,
CisgenderFemale,
CisgenderMale,
FemaleToMale,
GenderFluid,
GenderNonconforming,
GenderQuestioning,
GenderVariant,
Genderqueer,
Intersex,
MaleToFemale,
Neither,
Neutrois,
Nonbinary,
Pangender,
Trans,
TransStar,
TransFemale,
TransStarFemale,
TransMale,
TransStarMale,
TransPerson,
TransStarPerson,
Transfeminine,
Transgender,
TransgenderFemale,
TransgenderMale,
TransgenderPerson,
Transmasculine,
Transsexual,
TranssexualFemale,
TranssexualMale,
TranssexualPerson

func toString() -> String {
return String(self)
}
}

func ==(lhs: Gender, rhs: Gender) -> Bool {
return lhs.rawValue == rhs.rawValue
}
6 changes: 6 additions & 0 deletions test/swift/MyBaseClass.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import Foundation
import CoreData

public class MyBaseClass: NSManagedObject {
var ivar: Double = -1.0
}
63 changes: 63 additions & 0 deletions test/swift/main.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import Cocoa
import CoreData

struct CoreDataStore {
let moc: NSManagedObjectContext

init() {
let modelURL = NSURL(fileURLWithPath: "test.mom")
let model = NSManagedObjectModel(contentsOfURL: modelURL)
let psc = NSPersistentStoreCoordinator(managedObjectModel: model!)

do {
try psc.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil)
} catch {
assertionFailure("Can't bring up PSC")
}

moc = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
moc.persistentStoreCoordinator = psc
}
}

let dataStore = CoreDataStore()
let moc = dataStore.moc

let homer = ParentMO(managedObjectContext: moc)!
homer.humanName = "homer"
homer.parentName = homer.humanName
homer.ivar = 1.0
homer.gender = NSNumber(int: Gender.Male.rawValue)

let marge = ParentMO(managedObjectContext: moc)!
marge.humanName = "marge"
marge.parentName = marge.humanName
marge.ivar = 1.0
marge.gender = NSNumber(int: Gender.Female.rawValue)

assert(homer.children.count == 0)
assert(marge.children.count == 0)

let bart = ChildMO(managedObjectContext: moc)!
bart.humanName = "bart"
bart.childName = bart.humanName
bart.ivar = 1.0
bart.type = 64

let lisa = ChildMO(managedObjectContext: moc)!
lisa.humanName = "lisa"
lisa.childName = lisa.humanName
lisa.ivar = 1.0

do {
try moc.save()
assert(Gender(rawValue: homer.gender!.intValue) == .Male)
assert(Gender(rawValue: marge.gender!.intValue) == .Female)
assert(Gender(rawValue: bart.gender!.intValue) == .Undefined)
assert(Gender(rawValue: homer.gender!.intValue)!.toString() == "Male")

} catch {
assertionFailure("Failed to save")
}

print("Success")
19 changes: 3 additions & 16 deletions test/test.xcdatamodel/contents
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="6244" systemVersion="13E28" minimumToolsVersion="Xcode 4.5" macOSVersion="Automatic" iOSVersion="Automatic">
<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="10171" systemVersion="15E65" minimumToolsVersion="Xcode 4.5">
<entity name="Child" representedClassName="ChildMO" parentEntity="Human" syncable="YES">
<attribute name="childName" optional="YES" attributeType="String" syncable="YES"/>
<attribute name="type" optional="YES" attributeType="Integer 16" defaultValueString="0" syncable="YES"/>
Expand Down Expand Up @@ -31,8 +31,6 @@
<entry key="attributeValueScalarType" value="Gender"/>
</userInfo>
</attribute>
<attribute name="hairColor" optional="YES" transient="YES" syncable="YES"/>
<attribute name="hairColorStorage" optional="YES" transient="YES" attributeType="Binary" syncable="YES"/>
<attribute name="humanName" optional="YES" attributeType="String" syncable="YES"/>
<relationship name="meaninglessRelationship" optional="YES" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="EntitySansCustomClass" indexed="YES" syncable="YES"/>
<userInfo>
Expand All @@ -53,17 +51,6 @@
<attribute name="myInt64" optional="YES" attributeType="Integer 64" syncable="YES"/>
<attribute name="myString" optional="YES" attributeType="String" syncable="YES"/>
<attribute name="myTransformableSansClassName" optional="YES" attributeType="Transformable" syncable="YES"/>
<attribute name="myTransformableWithClassName" optional="YES" attributeType="Transformable" syncable="YES">
<userInfo>
<entry key="attributeValueClassName" value="NSColor"/>
</userInfo>
</attribute>
<attribute name="myTransformableWithProtocol" optional="YES" attributeType="Transformable" syncable="YES">
<userInfo>
<entry key="attributeTransformableProtocols" value="MyProtocol"/>
<entry key="attributeValueClassName" value="id&lt;MyProtocol>"/>
</userInfo>
</attribute>
<attribute name="parentName" optional="YES" attributeType="String" syncable="YES"/>
<relationship name="children" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Child" inverseName="parent" inverseEntity="Child" indexed="YES" syncable="YES"/>
</entity>
Expand All @@ -79,7 +66,7 @@
<element name="EntitySansCustomClass" positionX="502" positionY="90" width="128" height="60"/>
<element name="EntitySansCustomClass2" positionX="295" positionY="-189" width="128" height="58"/>
<element name="EntityWithBaseClass" positionX="342" positionY="18" width="128" height="60"/>
<element name="Human" positionX="169" positionY="18" width="128" height="133"/>
<element name="Parent" positionX="34" positionY="114" width="128" height="283"/>
<element name="Human" positionX="169" positionY="18" width="128" height="105"/>
<element name="Parent" positionX="34" positionY="114" width="128" height="255"/>
</elements>
</model>

0 comments on commit ef94b75

Please sign in to comment.