瀏覽代碼

mas_makeConstraints block returns array of installed MASConstraints, more tests

Jonas Budelmann 12 年之前
父節點
當前提交
e0da59d3e2

+ 12 - 0
Masonry.xcodeproj/project.pbxproj

@@ -62,6 +62,10 @@
 		DDA4D72917C0260C0076BD87 /* MASConstraintDelegateMock.m in Sources */ = {isa = PBXBuildFile; fileRef = DD38397D17A5170F00C35C17 /* MASConstraintDelegateMock.m */; };
 		DDA4D72917C0260C0076BD87 /* MASConstraintDelegateMock.m in Sources */ = {isa = PBXBuildFile; fileRef = DD38397D17A5170F00C35C17 /* MASConstraintDelegateMock.m */; };
 		DDA5752B17C17C3E0010F88E /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = DDA5752917C17C3E0010F88E /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		DDA5752B17C17C3E0010F88E /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = DDA5752917C17C3E0010F88E /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		DDA5752D17C187D40010F88E /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = DDA5752917C17C3E0010F88E /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		DDA5752D17C187D40010F88E /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = DDA5752917C17C3E0010F88E /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		DDB4A51517DC492F0055EDFE /* NSLayoutConstraint+MASDebugAdditionsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DDB4A51417DC492F0055EDFE /* NSLayoutConstraint+MASDebugAdditionsSpec.m */; };
+		DDB4A51617DC492F0055EDFE /* NSLayoutConstraint+MASDebugAdditionsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DDB4A51417DC492F0055EDFE /* NSLayoutConstraint+MASDebugAdditionsSpec.m */; };
+		DDB682AD17DC484900159454 /* View+MASAdditionsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DDB682AC17DC484900159454 /* View+MASAdditionsSpec.m */; };
+		DDB682AE17DC484900159454 /* View+MASAdditionsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DDB682AC17DC484900159454 /* View+MASAdditionsSpec.m */; };
 		DDE2653F179D24E600D48565 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = DDE2653D179D24E600D48565 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		DDE2653F179D24E600D48565 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = DDE2653D179D24E600D48565 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		DDF0BE9517C9D6DA00DEA237 /* MASConstraintMakerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DDF0BE9417C9D6DA00DEA237 /* MASConstraintMakerSpec.m */; };
 		DDF0BE9517C9D6DA00DEA237 /* MASConstraintMakerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DDF0BE9417C9D6DA00DEA237 /* MASConstraintMakerSpec.m */; };
 		DDF0BE9617C9D6DA00DEA237 /* MASConstraintMakerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DDF0BE9417C9D6DA00DEA237 /* MASConstraintMakerSpec.m */; };
 		DDF0BE9617C9D6DA00DEA237 /* MASConstraintMakerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DDF0BE9417C9D6DA00DEA237 /* MASConstraintMakerSpec.m */; };
@@ -138,6 +142,8 @@
 		DDA4D6F117C0253B0076BD87 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
 		DDA4D6F117C0253B0076BD87 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
 		DDA4D70117C0253B0076BD87 /* Masonry Mac Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Masonry Mac Tests.octest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		DDA4D70117C0253B0076BD87 /* Masonry Mac Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Masonry Mac Tests.octest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		DDA5752917C17C3E0010F88E /* MASUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASUtilities.h; sourceTree = "<group>"; };
 		DDA5752917C17C3E0010F88E /* MASUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASUtilities.h; sourceTree = "<group>"; };
+		DDB4A51417DC492F0055EDFE /* NSLayoutConstraint+MASDebugAdditionsSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSLayoutConstraint+MASDebugAdditionsSpec.m"; sourceTree = "<group>"; };
+		DDB682AC17DC484900159454 /* View+MASAdditionsSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "View+MASAdditionsSpec.m"; sourceTree = "<group>"; };
 		DDE2653D179D24E600D48565 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "View+MASShorthandAdditions.h"; sourceTree = "<group>"; };
 		DDE2653D179D24E600D48565 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "View+MASShorthandAdditions.h"; sourceTree = "<group>"; };
 		DDF0BE9417C9D6DA00DEA237 /* MASConstraintMakerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASConstraintMakerSpec.m; sourceTree = "<group>"; };
 		DDF0BE9417C9D6DA00DEA237 /* MASConstraintMakerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASConstraintMakerSpec.m; sourceTree = "<group>"; };
 		EDE028375B0043E190A00F61 /* Pods-Masonry Mac Tests.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Masonry Mac Tests.xcconfig"; path = "Pods/Pods-Masonry Mac Tests.xcconfig"; sourceTree = SOURCE_ROOT; };
 		EDE028375B0043E190A00F61 /* Pods-Masonry Mac Tests.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Masonry Mac Tests.xcconfig"; path = "Pods/Pods-Masonry Mac Tests.xcconfig"; sourceTree = SOURCE_ROOT; };
@@ -272,6 +278,8 @@
 				DD52F1D8179CAA9C005CD195 /* MASCompositeConstraintSpec.m */,
 				DD52F1D8179CAA9C005CD195 /* MASCompositeConstraintSpec.m */,
 				DD52F1D9179CAA9C005CD195 /* MASViewConstraintSpec.m */,
 				DD52F1D9179CAA9C005CD195 /* MASViewConstraintSpec.m */,
 				DDF0BE9417C9D6DA00DEA237 /* MASConstraintMakerSpec.m */,
 				DDF0BE9417C9D6DA00DEA237 /* MASConstraintMakerSpec.m */,
+				DDB682AC17DC484900159454 /* View+MASAdditionsSpec.m */,
+				DDB4A51417DC492F0055EDFE /* NSLayoutConstraint+MASDebugAdditionsSpec.m */,
 			);
 			);
 			name = Specs;
 			name = Specs;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -617,6 +625,8 @@
 				DD52F1DB179CAA9C005CD195 /* MASViewConstraintSpec.m in Sources */,
 				DD52F1DB179CAA9C005CD195 /* MASViewConstraintSpec.m in Sources */,
 				DD38397E17A5170F00C35C17 /* MASConstraintDelegateMock.m in Sources */,
 				DD38397E17A5170F00C35C17 /* MASConstraintDelegateMock.m in Sources */,
 				DDF0BE9517C9D6DA00DEA237 /* MASConstraintMakerSpec.m in Sources */,
 				DDF0BE9517C9D6DA00DEA237 /* MASConstraintMakerSpec.m in Sources */,
+				DDB682AD17DC484900159454 /* View+MASAdditionsSpec.m in Sources */,
+				DDB4A51517DC492F0055EDFE /* NSLayoutConstraint+MASDebugAdditionsSpec.m in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
@@ -642,6 +652,8 @@
 				DDA4D72817C026030076BD87 /* MASViewConstraintSpec.m in Sources */,
 				DDA4D72817C026030076BD87 /* MASViewConstraintSpec.m in Sources */,
 				DDA4D72917C0260C0076BD87 /* MASConstraintDelegateMock.m in Sources */,
 				DDA4D72917C0260C0076BD87 /* MASConstraintDelegateMock.m in Sources */,
 				DDF0BE9617C9D6DA00DEA237 /* MASConstraintMakerSpec.m in Sources */,
 				DDF0BE9617C9D6DA00DEA237 /* MASConstraintMakerSpec.m in Sources */,
+				DDB682AE17DC484900159454 /* View+MASAdditionsSpec.m in Sources */,
+				DDB4A51617DC492F0055EDFE /* NSLayoutConstraint+MASDebugAdditionsSpec.m in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};

+ 3 - 1
Masonry/MASConstraintMaker.h

@@ -59,7 +59,9 @@
 
 
 /**
 /**
  *	Calls install method on any MASConstraints which have been created by this maker
  *	Calls install method on any MASConstraints which have been created by this maker
+ *
+ *	@return	an array of all the installed MASConstraints
  */
  */
-- (void)install;
+- (NSArray *)install;
 
 
 @end
 @end

+ 4 - 2
Masonry/MASConstraintMaker.m

@@ -31,11 +31,13 @@
     return self;
     return self;
 }
 }
 
 
-- (void)install {
-    for (id<MASConstraint> constraint in self.constraints) {
+- (NSArray *)install {
+    NSArray *constraints = self.constraints.copy;
+    for (id<MASConstraint> constraint in constraints) {
         [constraint install];
         [constraint install];
     }
     }
     [self.constraints removeAllObjects];
     [self.constraints removeAllObjects];
+    return constraints;
 }
 }
 
 
 #pragma mark - MASConstraintDelegate
 #pragma mark - MASConstraintDelegate

+ 1 - 1
Masonry/View+MASAdditions.h

@@ -50,6 +50,6 @@
 
 
  @param block scope within which you can build up the constraints which you wish to apply to the view.
  @param block scope within which you can build up the constraints which you wish to apply to the view.
  */
  */
-- (void)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;
+- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;
 
 
 @end
 @end

+ 1 - 1
Masonry/View+MASAdditions.m

@@ -11,7 +11,7 @@
 
 
 @implementation MAS_VIEW (MASAdditions)
 @implementation MAS_VIEW (MASAdditions)
 
 
-- (void)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
+- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
     self.translatesAutoresizingMaskIntoConstraints = NO;
     self.translatesAutoresizingMaskIntoConstraints = NO;
     MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
     MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
     block(constraintMaker);
     block(constraintMaker);

+ 19 - 0
MasonryTests/MASCompositeConstraintSpec.m

@@ -133,4 +133,23 @@ it(@"should modify insets on appropriate children", ^{
     expect([children[5] layoutConstant]).to.equal(0);
     expect([children[5] layoutConstant]).to.equal(0);
 });
 });
 
 
+it(@"should uninstall", ^{
+    NSArray *children = @[
+        [[MASViewConstraint alloc] initWithFirstViewAttribute:view.mas_centerX],
+        [[MASViewConstraint alloc] initWithFirstViewAttribute:view.mas_centerY]
+    ];
+    composite = [[MASCompositeConstraint alloc] initWithChildren:children];
+    composite.delegate = delegate;
+    MAS_VIEW *newView = MAS_VIEW.new;
+    [superview addSubview:newView];
+
+    //first equality statement
+    composite.equalTo(newView);
+    [composite install];
+
+    expect(superview.constraints).to.haveCountOf(2);
+    [composite uninstall];
+    expect(superview.constraints).to.haveCountOf(0);
+});
+
 SpecEnd
 SpecEnd

+ 24 - 0
MasonryTests/MASConstraintMakerSpec.m

@@ -94,4 +94,28 @@ it(@"should create width and height children", ^{
     expect(viewConstraint.firstViewAttribute.layoutAttribute).to.equal(NSLayoutAttributeHeight);
     expect(viewConstraint.firstViewAttribute.layoutAttribute).to.equal(NSLayoutAttributeHeight);
 });
 });
 
 
+it(@"should install constraints", ^{
+    MAS_VIEW *newView = MAS_VIEW.new;
+    [superview addSubview:newView];
+
+    maker.edges.equalTo(newView);
+    maker.centerX.equalTo(@[newView, @10]);
+
+    expect([maker install]).to.haveCountOf(2);
+});
+
+it(@"should create new constraints", ^{
+    expect(maker.left).notTo.beIdenticalTo(maker.left);
+    expect(maker.right).notTo.beIdenticalTo(maker.right);
+    expect(maker.top).notTo.beIdenticalTo(maker.top);
+    expect(maker.bottom).notTo.beIdenticalTo(maker.bottom);
+    expect(maker.baseline).notTo.beIdenticalTo(maker.baseline);
+    expect(maker.leading).notTo.beIdenticalTo(maker.leading);
+    expect(maker.trailing).notTo.beIdenticalTo(maker.trailing);
+    expect(maker.width).notTo.beIdenticalTo(maker.width);
+    expect(maker.height).notTo.beIdenticalTo(maker.height);
+    expect(maker.centerX).notTo.beIdenticalTo(maker.centerX);
+    expect(maker.centerY).notTo.beIdenticalTo(maker.centerY);
+});
+
 SpecEnd
 SpecEnd

+ 38 - 0
MasonryTests/NSLayoutConstraint+MASDebugAdditionsSpec.m

@@ -0,0 +1,38 @@
+//
+//  NSLayoutConstraint+MASDebugAdditionsSpec.m
+//  Masonry
+//
+//  Created by Jonas Budelmann on 8/09/13.
+//  Copyright (c) 2013 Jonas Budelmann. All rights reserved.
+//
+
+#import "NSLayoutConstraint+MASDebugAdditions.h"
+#import "View+MASAdditions.h"
+#import "MASLayoutConstraint.h"
+
+SpecBegin(NSLayoutConstraint_MASDebugAdditions)
+
+it(@"should display view key", ^{
+    MAS_VIEW *newView = MAS_VIEW.new;
+    newView.mas_key = @"newView";
+
+    MASLayoutConstraint *layoutConstraint = [MASLayoutConstraint constraintWithItem:newView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:300];
+
+    NSString *description = [NSString stringWithFormat:@"<MASLayoutConstraint:%p %@:newView.width >= 300>", layoutConstraint, MAS_VIEW.class];
+    expect([layoutConstraint description]).to.equal(description);
+});
+
+it(@"should display layoutConstraint key", ^{
+    MAS_VIEW *newView1 = MAS_VIEW.new;
+    newView1.mas_key = @"newView1";
+    MAS_VIEW *newView2 = MAS_VIEW.new;
+    newView2.mas_key = @"newView2";
+
+    MASLayoutConstraint *layoutConstraint = [MASLayoutConstraint constraintWithItem:newView1 attribute:NSLayoutAttributeBaseline relatedBy:NSLayoutRelationEqual toItem:newView2 attribute:NSLayoutAttributeTop multiplier:1 constant:300];
+    layoutConstraint.mas_key = @"helloConstraint";
+
+    NSString *description = [NSString stringWithFormat:@"<MASLayoutConstraint:helloConstraint %@:newView1.baseline == %@:newView2.top + 300>", MAS_VIEW.class, MAS_VIEW.class];
+    expect([layoutConstraint description]).to.equal(description);
+});
+
+SpecEnd

+ 22 - 0
MasonryTests/View+MASAdditionsSpec.m

@@ -0,0 +1,22 @@
+//
+//  View+MASAdditionsSpec.m
+//  Masonry
+//
+//  Created by Jonas Budelmann on 8/09/13.
+//  Copyright (c) 2013 Jonas Budelmann. All rights reserved.
+//
+
+#import "View+MASAdditions.h"
+
+SpecBegin(View_MASAdditions)
+
+it(@"should set translatesAutoresizingMaskIntoConstraints", ^{
+    MAS_VIEW *newView = MAS_VIEW.new;
+    [newView mas_makeConstraints:^(MASConstraintMaker *make) {
+
+    }];
+
+    expect(newView.translatesAutoresizingMaskIntoConstraints).to.beFalsy();
+});
+
+SpecEnd