1#import "CPTXYPlotSpaceTests.h" 2#import "CPTXYGraph.h" 3#import "CPTXYPlotSpace.h" 4#import "CPTExceptions.h" 5#import "CPTPlotRange.h" 6#import "CPTUtilities.h" 7 8@interface CPTXYPlotSpace(testingAdditions) 9 10-(CPTPlotRange *)constrainRange:(CPTPlotRange *)existingRange toGlobalRange:(CPTPlotRange *)globalRange; 11 12@end 13 14#pragma mark - 15 16@implementation CPTXYPlotSpaceTests 17 18@synthesize graph; 19 20-(void)setUp 21{ 22 self.graph = [[(CPTXYGraph *)[CPTXYGraph alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 50.0)] autorelease]; 23 self.graph.paddingLeft = 0.0; 24 self.graph.paddingRight = 0.0; 25 self.graph.paddingTop = 0.0; 26 self.graph.paddingBottom = 0.0; 27 28 [self.graph layoutIfNeeded]; 29} 30 31-(void)tearDown 32{ 33 self.graph = nil; 34} 35 36-(void)testViewPointForPlotPoint 37{ 38 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 39 40 plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 41 length:CPTDecimalFromDouble(10.0)]; 42 plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 43 length:CPTDecimalFromDouble(10.0)]; 44 45 NSDecimal plotPoint[2]; 46 plotPoint[CPTCoordinateX] = CPTDecimalFromDouble(5.0); 47 plotPoint[CPTCoordinateY] = CPTDecimalFromDouble(5.0); 48 49 CGPoint viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; 50 51 STAssertEqualsWithAccuracy(viewPoint.x, (CGFloat)50.0, (CGFloat)0.01, @""); 52 STAssertEqualsWithAccuracy(viewPoint.y, (CGFloat)25.0, (CGFloat)0.01, @""); 53 54 plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 55 length:CPTDecimalFromDouble(10.0)]; 56 plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 57 length:CPTDecimalFromDouble(5.0)]; 58 59 viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; 60 61 STAssertEqualsWithAccuracy(viewPoint.x, (CGFloat)50.0, (CGFloat)0.01, @""); 62 STAssertEqualsWithAccuracy(viewPoint.y, (CGFloat)50.0, (CGFloat)0.01, @""); 63} 64 65-(void)testPlotPointForViewPoint 66{ 67 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 68 69 plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 70 length:CPTDecimalFromDouble(10.0)]; 71 plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 72 length:CPTDecimalFromDouble(10.0)]; 73 74 NSDecimal plotPoint[2]; 75 CGPoint viewPoint = CGPointMake(50.0, 25.0); 76 NSString *errMessage; 77 78 [plotSpace plotPoint:plotPoint forPlotAreaViewPoint:viewPoint]; 79 80 errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %@", NSDecimalString(&plotPoint[CPTCoordinateX], nil)]; 81 STAssertTrue(CPTDecimalEquals(plotPoint[CPTCoordinateX], CPTDecimalFromDouble(5.0)), errMessage); 82 errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateY] was %@", NSDecimalString(&plotPoint[CPTCoordinateY], nil)]; 83 STAssertTrue(CPTDecimalEquals(plotPoint[CPTCoordinateY], CPTDecimalFromDouble(5.0)), errMessage); 84} 85 86-(void)testDoublePrecisionPlotPointForViewPoint 87{ 88 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 89 90 plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 91 length:CPTDecimalFromDouble(10.0)]; 92 plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 93 length:CPTDecimalFromDouble(10.0)]; 94 95 double plotPoint[2]; 96 CGPoint viewPoint = CGPointMake(50.0, 25.0); 97 NSString *errMessage; 98 99 [plotSpace doublePrecisionPlotPoint:plotPoint forPlotAreaViewPoint:viewPoint]; 100 101 errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %g", plotPoint[CPTCoordinateX]]; 102 STAssertEquals(plotPoint[CPTCoordinateX], 5.0, errMessage); 103 errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateY] was %g", plotPoint[CPTCoordinateY]]; 104 STAssertEquals(plotPoint[CPTCoordinateY], 5.0, errMessage); 105} 106 107-(void)testConstrainNilRanges 108{ 109 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 110 111 STAssertEqualObjects([plotSpace constrainRange:plotSpace.xRange toGlobalRange:nil], plotSpace.xRange, @"Constrain to nil global range should return original range."); 112 STAssertNil([plotSpace constrainRange:nil toGlobalRange:plotSpace.xRange], @"Constrain nil range should return nil."); 113} 114 115-(void)testConstrainRanges1 116{ 117 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 118 119 CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.0) 120 length:CPTDecimalFromDouble(5.0)]; 121 CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 122 length:CPTDecimalFromDouble(10.0)]; 123 CPTPlotRange *expectedRange = existingRange; 124 125 CPTPlotRange *constrainedRange = [plotSpace constrainRange:existingRange toGlobalRange:globalRange]; 126 NSString *errMessage = [NSString stringWithFormat:@"constrainedRange was %@, expected %@", constrainedRange, expectedRange, nil]; 127 STAssertTrue([constrainedRange isEqualToRange:expectedRange], errMessage); 128} 129 130-(void)testConstrainRanges2 131{ 132 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 133 134 CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 135 length:CPTDecimalFromDouble(10.0)]; 136 CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 137 length:CPTDecimalFromDouble(5.0)]; 138 CPTPlotRange *expectedRange = globalRange; 139 140 CPTPlotRange *constrainedRange = [plotSpace constrainRange:existingRange toGlobalRange:globalRange]; 141 NSString *errMessage = [NSString stringWithFormat:@"constrainedRange was %@, expected %@", constrainedRange, expectedRange, nil]; 142 STAssertTrue([constrainedRange isEqualToRange:expectedRange], errMessage); 143} 144 145-(void)testConstrainRanges3 146{ 147 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 148 149 CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) 150 length:CPTDecimalFromDouble(8.0)]; 151 CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 152 length:CPTDecimalFromDouble(10.0)]; 153 CPTPlotRange *expectedRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 154 length:CPTDecimalFromDouble(8.0)]; 155 156 CPTPlotRange *constrainedRange = [plotSpace constrainRange:existingRange toGlobalRange:globalRange]; 157 NSString *errMessage = [NSString stringWithFormat:@"constrainedRange was %@, expected %@", constrainedRange, expectedRange, nil]; 158 STAssertTrue([constrainedRange isEqualToRange:expectedRange], errMessage); 159} 160 161-(void)testConstrainRanges4 162{ 163 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 164 165 CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(3.0) 166 length:CPTDecimalFromDouble(8.0)]; 167 CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 168 length:CPTDecimalFromDouble(10.0)]; 169 CPTPlotRange *expectedRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.0) 170 length:CPTDecimalFromDouble(8.0)]; 171 172 CPTPlotRange *constrainedRange = [plotSpace constrainRange:existingRange toGlobalRange:globalRange]; 173 NSString *errMessage = [NSString stringWithFormat:@"constrainedRange was %@, expected %@", constrainedRange, expectedRange, nil]; 174 STAssertTrue([constrainedRange isEqualToRange:expectedRange], errMessage); 175} 176 177-(void)testScaleByAboutPoint1 178{ 179 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 180 plotSpace.allowsUserInteraction = YES; 181 182 plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 183 length:CPTDecimalFromDouble(10.0)]; 184 plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(10.0) 185 length:CPTDecimalFromDouble(-10.0)]; 186 187 CGRect myBounds = self.graph.bounds; 188 189 [plotSpace scaleBy:0.5 aboutPoint:CGPointMake(CGRectGetMidX(myBounds), CGRectGetMidY(myBounds))]; 190 191 CPTPlotRange *expectedRangeX = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-5.0) 192 length:CPTDecimalFromDouble(20.0)]; 193 CPTPlotRange *expectedRangeY = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(15.0) 194 length:CPTDecimalFromDouble(-20.0)]; 195 196 NSString *errMessage = [NSString stringWithFormat:@"xRange was %@, expected %@", plotSpace.xRange, expectedRangeX, nil]; 197 STAssertTrue([plotSpace.xRange isEqualToRange:expectedRangeX], errMessage); 198 199 errMessage = [NSString stringWithFormat:@"yRange was %@, expected %@", plotSpace.yRange, expectedRangeY, nil]; 200 STAssertTrue([plotSpace.yRange isEqualToRange:expectedRangeY], errMessage); 201} 202 203-(void)testScaleByAboutPoint2 204{ 205 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 206 plotSpace.allowsUserInteraction = YES; 207 208 plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 209 length:CPTDecimalFromDouble(10.0)]; 210 plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(10.0) 211 length:CPTDecimalFromDouble(-10.0)]; 212 213 CGRect myBounds = self.graph.bounds; 214 215 [plotSpace scaleBy:2.0 aboutPoint:CGPointMake(CGRectGetMidX(myBounds), CGRectGetMidY(myBounds))]; 216 217 CPTPlotRange *expectedRangeX = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.5) 218 length:CPTDecimalFromDouble(5.0)]; 219 CPTPlotRange *expectedRangeY = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(7.5) 220 length:CPTDecimalFromDouble(-5.0)]; 221 222 NSString *errMessage = [NSString stringWithFormat:@"xRange was %@, expected %@", plotSpace.xRange, expectedRangeX, nil]; 223 STAssertTrue([plotSpace.xRange isEqualToRange:expectedRangeX], errMessage); 224 225 errMessage = [NSString stringWithFormat:@"yRange was %@, expected %@", plotSpace.yRange, expectedRangeY, nil]; 226 STAssertTrue([plotSpace.yRange isEqualToRange:expectedRangeY], errMessage); 227} 228 229#pragma mark - 230#pragma mark NSCoding 231 232-(void)testKeyedArchivingRoundTrip 233{ 234 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 235 plotSpace.globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) 236 length:CPTDecimalFromDouble(10.0)]; 237 plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(10.0) 238 length:CPTDecimalFromDouble(-10.0)]; 239 240 CPTXYPlotSpace *newPlotSpace = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:plotSpace]]; 241 242 NSString *errMessage = [NSString stringWithFormat:@"xRange was %@, expected %@", plotSpace.xRange, newPlotSpace.xRange, nil]; 243 STAssertTrue([plotSpace.xRange isEqualToRange:newPlotSpace.xRange], errMessage); 244 245 errMessage = [NSString stringWithFormat:@"yRange was %@, expected %@", plotSpace.yRange, newPlotSpace.yRange, nil]; 246 STAssertTrue([plotSpace.yRange isEqualToRange:newPlotSpace.yRange], errMessage); 247 248 errMessage = [NSString stringWithFormat:@"globalXRange was %@, expected %@", plotSpace.globalXRange, newPlotSpace.globalXRange, nil]; 249 STAssertTrue([plotSpace.globalXRange isEqualToRange:newPlotSpace.globalXRange], errMessage); 250 251 errMessage = [NSString stringWithFormat:@"globalYRange was %@, expected %@", plotSpace.globalYRange, newPlotSpace.globalYRange, nil]; 252 STAssertTrue([plotSpace.globalYRange isEqualToRange:newPlotSpace.globalYRange], errMessage); 253 254 STAssertEquals(plotSpace.xScaleType, newPlotSpace.xScaleType, @"xScaleType not equal"); 255 STAssertEquals(plotSpace.yScaleType, newPlotSpace.yScaleType, @"yScaleType not equal"); 256} 257 258@end 259