// 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.otherElements[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 0);
  XCTAssertEqual(platform_view.frame.origin.y, 0);
  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.otherElements[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 0);
  XCTAssertEqual(platform_view.frame.origin.y, 0);
  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.otherElements[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 0);
  XCTAssertEqual(platform_view.frame.origin.y, 0);
  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, 245);
  XCTAssertEqual(overlay.frame.size.width, 50);
  // Half the height of the overlay.
  XCTAssertEqual(overlay.frame.size.height, 5);

  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.otherElements[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 0);
  XCTAssertEqual(platform_view.frame.origin.y, 0);
  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.otherElements[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 0);
  XCTAssertEqual(platform_view.frame.origin.y, 0);
  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, 25);

  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]"];
  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.otherElements[@"platform_view[0]"];
  XCTAssertTrue([platform_view1 waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view1.frame.origin.x, 0);
  XCTAssertEqual(platform_view1.frame.origin.y, 300);
  XCTAssertEqual(platform_view1.frame.size.width, 250);
  XCTAssertEqual(platform_view1.frame.size.height, 250);

  XCUIElement* platform_view2 = app.otherElements[@"platform_view[1]"];
  XCTAssertTrue(platform_view2.exists);
  XCTAssertEqual(platform_view2.frame.origin.x, 0);
  XCTAssertEqual(platform_view2.frame.origin.y, 0);
  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.otherElements[@"platform_view[0]"];
  XCTAssertTrue([platform_view1 waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view1.frame.origin.x, 25);
  XCTAssertEqual(platform_view1.frame.origin.y, 300);
  XCTAssertEqual(platform_view1.frame.size.width, 250);
  XCTAssertEqual(platform_view1.frame.size.height, 250);

  XCUIElement* platform_view2 = app.otherElements[@"platform_view[1]"];
  XCTAssertTrue(platform_view2.exists);
  XCTAssertEqual(platform_view2.frame.origin.x, 25);
  XCTAssertEqual(platform_view2.frame.origin.y, 0);
  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, 25);
  XCTAssertEqual(overlay1.frame.origin.y, 300);
  XCTAssertEqual(overlay1.frame.size.width, 225);
  XCTAssertEqual(overlay1.frame.size.height, 200);

  XCUIElement* overlay2 = app.otherElements[@"platform_view[1].overlay[0]"];
  XCTAssertTrue(overlay2.exists);
  XCTAssertEqual(overlay2.frame.origin.x, 25);
  XCTAssertEqual(overlay2.frame.origin.y, 0);
  XCTAssertEqual(overlay2.frame.size.width, 225);
  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.otherElements[@"platform_view[0]"];
  XCTAssertTrue([platform_view waitForExistenceWithTimeout:1.0]);
  XCTAssertEqual(platform_view.frame.origin.x, 0);
  XCTAssertEqual(platform_view.frame.origin.y, 0);
  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
