// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import <XCTest/XCTest.h>

static const CGFloat kCompareAccuracy = 0.001;

@interface UnobstructedPlatformViewTests : XCTestCase

@end

@implementation UnobstructedPlatformViewTests

- (void)setUp {
  self.continueAfterFailure = NO;
}

// A is the layer, which z index is higher than the platform view.
// +--------+
// | PV     |  +---+
// +--------+  | A |
//             +---+
- (void)testNoOverlay {
  XCUIApplication* app = [[XCUIApplication alloc] init];
  app.launchArguments =
      @[ @"--platform-view-no-overlay-intersection", @"--enable-software-rendering" ];
  [app launch];

  XCUIElement* platform_view = app.textViews[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 25);
  XCTAssertEqual(platform_view.frame.origin.y, 25);
  XCTAssertEqual(platform_view.frame.size.width, 250);
  XCTAssertEqual(platform_view.frame.size.height, 250);

  XCUIElement* overlay = app.otherElements[@"platform_view[0].overlay[0]"];
  XCTAssertFalse(overlay.exists);
}

// A is the layer above the platform view.
// +-----------------+
// | PV        +---+ |
// |           | A | |
// |           +---+ |
// +-----------------+
- (void)testOneOverlay {
  XCUIApplication* app = [[XCUIApplication alloc] init];
  app.launchArguments = @[ @"--platform-view" ];
  [app launch];

  XCUIElement* platform_view = app.textViews[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 25);
  XCTAssertEqual(platform_view.frame.origin.y, 25);
  XCTAssertEqual(platform_view.frame.size.width, 250);
  XCTAssertEqual(platform_view.frame.size.height, 250);

  XCUIElement* overlay = app.otherElements[@"platform_view[0].overlay[0]"];
  XCTAssertTrue(overlay.exists);
  XCTAssertEqual(overlay.frame.origin.x, 150);
  XCTAssertEqual(overlay.frame.origin.y, 150);
  XCTAssertEqual(overlay.frame.size.width, 50);
  XCTAssertEqual(overlay.frame.size.height, 50);

  XCUIElement* overlayView = app.otherElements[@"platform_view[0].overlay_view[0]"];
  XCTAssertTrue(overlayView.exists);
  // Overlay should always be the same frame as the app.
  XCTAssertEqualWithAccuracy(overlayView.frame.origin.x, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView.frame.origin.y, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView.frame.size.width, app.frame.size.width, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView.frame.size.height, app.frame.size.height,
                             kCompareAccuracy);
}

// A is the layer above the platform view.
// +-----------------+
// | PV        +---+ |
// +-----------| A |-+
//             +---+
- (void)testOneOverlayPartialIntersection {
  XCUIApplication* app = [[XCUIApplication alloc] init];
  app.launchArguments = @[ @"--platform-view-partial-intersection" ];
  [app launch];

  XCUIElement* platform_view = app.textViews[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 25);
  XCTAssertEqual(platform_view.frame.origin.y, 25);
  XCTAssertEqual(platform_view.frame.size.width, 250);
  XCTAssertEqual(platform_view.frame.size.height, 250);

  XCUIElement* overlay = app.otherElements[@"platform_view[0].overlay[0]"];
  XCTAssertTrue(overlay.exists);
  XCTAssertEqual(overlay.frame.origin.x, 200);
  XCTAssertEqual(overlay.frame.origin.y, 250);
  XCTAssertEqual(overlay.frame.size.width, 50);
  // Half the height of the overlay.
  XCTAssertEqual(overlay.frame.size.height, 25);

  XCUIElement* overlayView = app.otherElements[@"platform_view[0].overlay_view[0]"];
  XCTAssertTrue(overlayView.exists);
  // Overlay should always be the same frame as the app.
  XCTAssertEqualWithAccuracy(overlayView.frame.origin.x, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView.frame.origin.y, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView.frame.size.width, app.frame.size.width, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView.frame.size.height, app.frame.size.height,
                             kCompareAccuracy);
}

// A and B are the layers above the platform view.
// +--------------------+
// | PV  +------------+ |
// |      | B +-----+ | |
// |      +---|  A  |-+ |
// +----------|     |---+
//            +-----+
- (void)testTwoIntersectingOverlays {
  XCUIApplication* app = [[XCUIApplication alloc] init];
  app.launchArguments = @[ @"--platform-view-two-intersecting-overlays" ];
  [app launch];

  XCUIElement* platform_view = app.textViews[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 25);
  XCTAssertEqual(platform_view.frame.origin.y, 25);
  XCTAssertEqual(platform_view.frame.size.width, 250);
  XCTAssertEqual(platform_view.frame.size.height, 250);

  XCUIElement* overlay = app.otherElements[@"platform_view[0].overlay[0]"];
  XCTAssertTrue(overlay.exists);
  XCTAssertEqual(overlay.frame.origin.x, 150);
  XCTAssertEqual(overlay.frame.origin.y, 150);
  XCTAssertEqual(overlay.frame.size.width, 75);
  XCTAssertEqual(overlay.frame.size.height, 75);

  XCTAssertFalse(app.otherElements[@"platform_view[0].overlay[1]"].exists);
}

// A, B, and C are the layers above the platform view.
// +-------------------------+
// | PV        +-----------+ |
// | +---+     | B +-----+ | |
// | | C |     +---|  A  |-+ |
// | +---+         +-----+   |
// +-------------------------+
- (void)testOneOverlayAndTwoIntersectingOverlays {
  XCUIApplication* app = [[XCUIApplication alloc] init];
  app.launchArguments = @[ @"--platform-view-one-overlay-two-intersecting-overlays" ];
  [app launch];

  XCUIElement* platform_view = app.textViews[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 25);
  XCTAssertEqual(platform_view.frame.origin.y, 25);
  XCTAssertEqual(platform_view.frame.size.width, 250);
  XCTAssertEqual(platform_view.frame.size.height, 250);

  XCUIElement* overlay1 = app.otherElements[@"platform_view[0].overlay[0]"];
  XCTAssertTrue(overlay1.exists);
  XCTAssertEqual(overlay1.frame.origin.x, 150);
  XCTAssertEqual(overlay1.frame.origin.y, 150);
  XCTAssertEqual(overlay1.frame.size.width, 75);
  XCTAssertEqual(overlay1.frame.size.height, 75);

  XCUIElement* overlay2 = app.otherElements[@"platform_view[0].overlay[1]"];
  XCTAssertTrue(overlay2.exists);
  XCTAssertEqual(overlay2.frame.origin.x, 75);
  XCTAssertEqual(overlay2.frame.origin.y, 225);
  XCTAssertEqual(overlay2.frame.size.width, 50);
  XCTAssertEqual(overlay2.frame.size.height, 50);

  XCUIElement* overlayView0 = app.otherElements[@"platform_view[0].overlay_view[0]"];
  XCTAssertTrue(overlayView0.exists);
  // Overlay should always be the same frame as the app.
  XCTAssertEqualWithAccuracy(overlayView0.frame.origin.x, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView0.frame.origin.y, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView0.frame.size.width, app.frame.size.width, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView0.frame.size.height, app.frame.size.height,
                             kCompareAccuracy);

  XCUIElement* overlayView1 = app.otherElements[@"platform_view[0].overlay_view[0]"];
  XCTAssertTrue(overlayView1.exists);
  // Overlay should always be the same frame as the app.
  XCTAssertEqualWithAccuracy(overlayView1.frame.origin.x, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView1.frame.origin.y, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView1.frame.size.width, app.frame.size.width, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView1.frame.size.height, app.frame.size.height,
                             kCompareAccuracy);
}

// A is the layer, which z index is higher than the platform view.
// +--------+
// | PV     |  +---+
// +--------+  | A |
// +--------+  +---+
// | PV     |
// +--------+
- (void)testMultiplePlatformViewsWithoutOverlays {
  XCUIApplication* app = [[XCUIApplication alloc] init];
  app.launchArguments = @[ @"--platform-view-multiple-without-overlays" ];
  [app launch];

  XCUIElement* platform_view1 = app.textViews[@"platform_view[0]"];
  XCTAssertTrue([platform_view1 waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view1.frame.origin.x, 25);
  XCTAssertEqual(platform_view1.frame.origin.y, 325);
  XCTAssertEqual(platform_view1.frame.size.width, 250);
  XCTAssertEqual(platform_view1.frame.size.height, 250);

  XCUIElement* platform_view2 = app.textViews[@"platform_view[1]"];
  XCTAssertTrue(platform_view2.exists);
  XCTAssertEqual(platform_view2.frame.origin.x, 25);
  XCTAssertEqual(platform_view2.frame.origin.y, 25);
  XCTAssertEqual(platform_view2.frame.size.width, 250);
  XCTAssertEqual(platform_view2.frame.size.height, 250);

  XCTAssertFalse(app.otherElements[@"platform_view[0].overlay[0]"].exists);
  XCTAssertFalse(app.otherElements[@"platform_view[1].overlay[0]"].exists);
  XCTAssertFalse(app.otherElements[@"platform_view[0].overlay_view[0]"].exists);
  XCTAssertFalse(app.otherElements[@"platform_view[1].overlay_view[0]"].exists);
}

// A is the layer above both platform view.
// +------------+
// | PV  +----+ |
// +-----| A  |-+
// +-----|    |-+
// | PV  +----+ |
// +------------+
- (void)testMultiplePlatformViewsWithOverlays {
  XCUIApplication* app = [[XCUIApplication alloc] init];
  app.launchArguments = @[ @"--platform-view-multiple-background-foreground" ];
  [app launch];

  XCUIElement* platform_view1 = app.textViews[@"platform_view[0]"];
  XCTAssertTrue([platform_view1 waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view1.frame.origin.x, 50);
  XCTAssertEqual(platform_view1.frame.origin.y, 325);
  XCTAssertEqual(platform_view1.frame.size.width, 250);
  XCTAssertEqual(platform_view1.frame.size.height, 250);

  XCUIElement* platform_view2 = app.textViews[@"platform_view[1]"];
  XCTAssertTrue(platform_view2.exists);
  XCTAssertEqual(platform_view2.frame.origin.x, 50);
  XCTAssertEqual(platform_view2.frame.origin.y, 25);
  XCTAssertEqual(platform_view2.frame.size.width, 250);
  XCTAssertEqual(platform_view2.frame.size.height, 250);

  XCUIElement* overlay1 = app.otherElements[@"platform_view[0].overlay[0]"];
  XCTAssertTrue(overlay1.exists);
  XCTAssertEqual(overlay1.frame.origin.x, 50);
  XCTAssertEqual(overlay1.frame.origin.y, 325);
  XCTAssertEqual(overlay1.frame.size.width, 200);
  XCTAssertEqual(overlay1.frame.size.height, 175);

  XCUIElement* overlay2 = app.otherElements[@"platform_view[1].overlay[0]"];
  XCTAssertTrue(overlay2.exists);
  XCTAssertEqual(overlay2.frame.origin.x, 50);
  XCTAssertEqual(overlay2.frame.origin.y, 25);
  XCTAssertEqual(overlay2.frame.size.width, 200);
  XCTAssertEqual(overlay2.frame.size.height, 250);

  XCUIElement* overlayView0 = app.otherElements[@"platform_view[0].overlay_view[0]"];
  XCTAssertTrue(overlayView0.exists);
  // Overlay should always be the same frame as the app.
  XCTAssertEqualWithAccuracy(overlayView0.frame.origin.x, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView0.frame.origin.y, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView0.frame.size.width, app.frame.size.width, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView0.frame.size.height, app.frame.size.height,
                             kCompareAccuracy);

  XCUIElement* overlayView1 = app.otherElements[@"platform_view[1].overlay_view[0]"];
  XCTAssertTrue(overlayView1.exists);
  // Overlay should always be the same frame as the app.
  XCTAssertEqualWithAccuracy(overlayView1.frame.origin.x, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView1.frame.origin.y, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView1.frame.size.width, app.frame.size.width, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView1.frame.size.height, app.frame.size.height,
                             kCompareAccuracy);
}

// More then two overlays are merged into a single layer.
// +---------------------+
// | +---+  +---+  +---+ |
// | | A |  | B |  | C | |
// | +---+  +---+  +---+ |
// | +-------+           |
// +-|   D   |-----------+
//   +-------+
- (void)testPlatformViewsMaxOverlays {
  XCUIApplication* app = [[XCUIApplication alloc] init];
  app.launchArguments = @[ @"--platform-view-max-overlays" ];
  [app launch];

  XCUIElement* platform_view = app.textViews[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 25);
  XCTAssertEqual(platform_view.frame.origin.y, 25);
  XCTAssertEqual(platform_view.frame.size.width, 250);
  XCTAssertEqual(platform_view.frame.size.height, 250);

  XCUIElement* overlay = app.otherElements[@"platform_view[0].overlay[0]"];
  XCTAssertTrue(overlay.exists);
  XCTAssertFalse(app.otherElements[@"platform_view[0].overlay[1]"].exists);
  XCTAssertTrue(CGRectContainsRect(platform_view.frame, overlay.frame));

  XCUIElement* overlayView0 = app.otherElements[@"platform_view[0].overlay_view[0]"];
  XCTAssertTrue(overlayView0.exists);
  // Overlay should always be the same frame as the app.
  XCTAssertEqualWithAccuracy(overlayView0.frame.origin.x, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView0.frame.origin.y, app.frame.origin.x, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView0.frame.size.width, app.frame.size.width, kCompareAccuracy);
  XCTAssertEqualWithAccuracy(overlayView0.frame.size.height, app.frame.size.height,
                             kCompareAccuracy);

  XCUIElement* overlayView1 = app.otherElements[@"platform_view[0].overlay_view[1]"];
  XCTAssertFalse(overlayView1.exists);
}

@end
