// 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 <Flutter/Flutter.h>
#import <XCTest/XCTest.h>
#import "AppDelegate.h"

@interface FlutterEngineTest : XCTestCase
@end

@implementation FlutterEngineTest

- (void)testIsolateId {
  FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"test" project:nil];
  XCTAssertNil(engine.isolateId);
  [self keyValueObservingExpectationForObject:engine keyPath:@"isolateId" handler:nil];

  XCTAssertTrue([engine runWithEntrypoint:nil]);

  [self waitForExpectationsWithTimeout:30.0 handler:nil];

  XCTAssertNotNil(engine.isolateId);
  XCTAssertTrue([engine.isolateId hasPrefix:@"isolates/"]);

  [engine destroyContext];

  XCTAssertNil(engine.isolateId);
}

- (void)testChannelSetup {
  FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"test" project:nil];
  XCTAssertNil(engine.navigationChannel);
  XCTAssertNil(engine.platformChannel);
  XCTAssertNil(engine.lifecycleChannel);

  XCTAssertTrue([engine runWithEntrypoint:nil]);

  XCTAssertNotNil(engine.navigationChannel);
  XCTAssertNotNil(engine.platformChannel);
  XCTAssertNotNil(engine.lifecycleChannel);

  [engine destroyContext];

  XCTAssertNil(engine.navigationChannel);
  XCTAssertNil(engine.platformChannel);
  XCTAssertNil(engine.lifecycleChannel);
}

@end
