// 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 run]);

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

  [engine destroyContext];

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

@end
