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