Home | History | Annotate | Download | only in cocoa
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
      6 #include "chrome/browser/ui/cocoa/image_utils.h"
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 
      9 @interface ImageUtilsTestView : NSView {
     10  @private
     11   // Determine whether the view is flipped.
     12   BOOL isFlipped_;
     13 
     14   // Determines whether to draw using the new method with
     15   // |neverFlipped:|.
     16   BOOL useNeverFlipped_;
     17 
     18   // Passed to |neverFlipped:| when drawing |image_|.
     19   BOOL neverFlipped_;
     20 
     21   scoped_nsobject<NSImage> image_;
     22 }
     23 @property(assign, nonatomic) BOOL isFlipped;
     24 @property(assign, nonatomic) BOOL useNeverFlipped;
     25 @property(assign, nonatomic) BOOL neverFlipped;
     26 @end
     27 
     28 @implementation ImageUtilsTestView
     29 @synthesize isFlipped = isFlipped_;
     30 @synthesize useNeverFlipped = useNeverFlipped_;
     31 @synthesize neverFlipped = neverFlipped_;
     32 
     33 - (id)initWithFrame:(NSRect)rect {
     34   self = [super initWithFrame:rect];
     35   if (self) {
     36     rect = NSInsetRect(rect, 5.0, 5.0);
     37     rect.origin = NSZeroPoint;
     38     const NSSize imageSize = NSInsetRect(rect, 5.0, 5.0).size;
     39     image_.reset([[NSImage alloc] initWithSize:imageSize]);
     40 
     41     NSBezierPath* path = [NSBezierPath bezierPath];
     42     [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect))];
     43     [path lineToPoint:NSMakePoint(NSMinX(rect), NSMaxY(rect))];
     44     [path lineToPoint:NSMakePoint(NSMaxX(rect), NSMinY(rect))];
     45     [path closePath];
     46 
     47     [image_ lockFocus];
     48     [[NSColor blueColor] setFill];
     49     [path fill];
     50     [image_ unlockFocus];
     51   }
     52   return self;
     53 }
     54 
     55 - (void)drawRect:(NSRect)rect {
     56   NSBezierPath* path = [NSBezierPath bezierPath];
     57   [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect))];
     58   [path lineToPoint:NSMakePoint(NSMinX(rect), NSMaxY(rect))];
     59   [path lineToPoint:NSMakePoint(NSMaxX(rect), NSMinY(rect))];
     60   [path closePath];
     61 
     62   [[NSColor redColor] setFill];
     63   [path fill];
     64 
     65   rect = NSInsetRect(rect, 5.0, 5.0);
     66   rect = NSOffsetRect(rect, 2.0, 2.0);
     67 
     68   if (useNeverFlipped_) {
     69     [image_ drawInRect:rect
     70               fromRect:NSZeroRect
     71              operation:NSCompositeCopy
     72               fraction:1.0
     73           neverFlipped:neverFlipped_];
     74   } else {
     75     [image_ drawInRect:rect
     76               fromRect:NSZeroRect
     77              operation:NSCompositeCopy
     78               fraction:1.0];
     79   }
     80 }
     81 
     82 @end
     83 
     84 namespace {
     85 
     86 class ImageUtilTest : public CocoaTest {
     87  public:
     88   ImageUtilTest() {
     89     const NSRect frame = NSMakeRect(0, 0, 300, 100);
     90     scoped_nsobject<ImageUtilsTestView> view(
     91         [[ImageUtilsTestView alloc] initWithFrame: frame]);
     92     view_ = view.get();
     93     [[test_window() contentView] addSubview:view_];
     94   }
     95 
     96   NSData* SnapshotView() {
     97     [view_ display];
     98 
     99     const NSRect bounds = [view_ bounds];
    100 
    101     [view_ lockFocus];
    102     scoped_nsobject<NSBitmapImageRep> bitmap(
    103         [[NSBitmapImageRep alloc] initWithFocusedViewRect:bounds]);
    104     [view_ unlockFocus];
    105 
    106     return [bitmap TIFFRepresentation];
    107   }
    108 
    109   NSData* SnapshotViewBase() {
    110     [view_ setUseNeverFlipped:NO];
    111     return SnapshotView();
    112   }
    113 
    114   NSData* SnapshotViewNeverFlipped(BOOL neverFlipped) {
    115     [view_ setUseNeverFlipped:YES];
    116     [view_ setNeverFlipped:neverFlipped];
    117     return SnapshotView();
    118   }
    119 
    120   ImageUtilsTestView* view_;
    121 };
    122 
    123 TEST_F(ImageUtilTest, Test) {
    124   // When not flipped, both drawing methods return the same data.
    125   [view_ setIsFlipped:NO];
    126   NSData* baseSnapshotData = SnapshotViewBase();
    127   EXPECT_TRUE([baseSnapshotData isEqualToData:SnapshotViewNeverFlipped(YES)]);
    128   EXPECT_TRUE([baseSnapshotData isEqualToData:SnapshotViewNeverFlipped(NO)]);
    129 
    130   // When flipped, there's only a difference when the context flip is
    131   // not being respected.
    132   [view_ setIsFlipped:YES];
    133   baseSnapshotData = SnapshotViewBase();
    134   EXPECT_FALSE([baseSnapshotData isEqualToData:SnapshotViewNeverFlipped(YES)]);
    135   EXPECT_TRUE([baseSnapshotData isEqualToData:SnapshotViewNeverFlipped(NO)]);
    136 }
    137 
    138 }  // namespace
    139