Come devo eseguire un test unitario per la matematica CGRect complicata?
-
27-10-2019 - |
Domanda
Ho un metodo che esegue operazioni aritmetiche su un insieme di viste UIV e le loro trasformazioni.Lo unit test prevede una risposta specifica;il programma sta dando il via a una risposta che è disattivata da .0001 che suona come un problema di arrotondamento minore che posso affrontare.Qual è il modo migliore per affrontare questo problema?C'è un modo per essere meno severi?Devo essere più esigente riguardo al confronto e aspettarmi che corrispondano perfettamente?
Il codice pertinente:
//the unit test
CGRect rect0 = CGRectMake(100, 100, 100, 100);
CGRect rect1 = CGRectMake(111, 111, 111, 111);
CGRect rect2 = CGRectMake(-200, -200, 2000, 2000);
CGRect rect3 = CGRectMake(333, -333, 333, 3333);
CGRect rect4 = CGRectMake(4, 4, 4, -4);
CGRect rect5 = CGRectMake(-54, 55, 55, -5555);
CGAffineTransform trans0 = CGAffineTransformIdentity;
CGAffineTransform trans1 = CGAffineTransformIdentity;
CGAffineTransform trans2 = CGAffineTransformMakeScale(2, 2);
CGAffineTransform trans3 = CGAffineTransformMakeScale(-5, 20);
CGAffineTransform trans4 = CGAffineTransformMakeRotation(M_PI / 2);
CGAffineTransform trans5 = CGAffineTransformMakeRotation(34);
CGRect rect0_1 = CGRectUnion(rect0, rect1);
CGRect rect0_2 = CGRectUnion(rect0, CGRectApplyAffineTransform(rect2, trans2));
CGRect rect0_3 = CGRectUnion(rect0, CGRectApplyAffineTransform(rect3, trans3));
CGRect rect0_4 = CGRectUnion(rect0, CGRectApplyAffineTransform(rect4, trans4));
CGRect rect0_5 = CGRectUnion(rect0, CGRectApplyAffineTransform(rect5, trans5));
.
.
.
rectTest = CGRectZero;
rectExpected = rect0_5;
STAssertNoThrow(rectTest = self.testCanvas.selectionBounds, @"Exception when retrieving selection bounds");
STAssertTrue(CGRectEqualToRect(rectTest, rectExpected), @"Selection bounds not correct: %@ vs %@", NSStringFromCGRect(rectTest), NSStringFromCGRect(rectExpected));
//the relevant method
- (CGRect)selectionBounds {
CGRect selectionRect = CGRectZero;
CGRect layerFrame;
NSSet *layers = [self selectedLayers]; //TODO should this be optomized out?
for(UIView *layer in layers) {
CGPoint center = CGPointApplyAffineTransform(layer.center, layer.transform);
layerFrame = layer.bounds;
layerFrame = CGRectApplyAffineTransform(layerFrame, layer.transform);
layerFrame = CGRectOffset(layerFrame, center.x - CGRectGetMidX(layerFrame), center.y - CGRectGetMidY(layerFrame));
if(CGRectIsEmpty(selectionRect)) {
selectionRect = layerFrame;
} else {
selectionRect = CGRectUnion(selectionRect, layerFrame);
}
}
return selectionRect;
}
//the output
[snip]: error: -[CanvasTests testSelectionBounds] : "CGRectEqualToRect(rectTest, rectExpected)" should be true. Selection bounds not correct: {{-29.9481, -75.2419}, {2985.73, 4742.91}} vs {{-29.9481, -75.2418}, {2985.73, 4742.91}}
Soluzione
Qual è il modo migliore per affrontare questo problema?C'è un modo per essere meno severi?
scrivere una funzione di confronto che consenta una tolleranza adeguata.
Dovrei essere più esigente riguardo al confronto e aspettarmi che corrispondano perfettamente?
in questo caso, direi che la tolleranza / differenza che osservi è accettabile (dopotutto, è fp, e una deviazione che hai detto è accettabile).