import FlutterMacOS
import Cocoa
import XCTest
{{#withPlatformChannelPluginHook}}

@testable import {{pluginProjectName}}

// This demonstrates a simple unit test of the Swift portion of this plugin's implementation.
//
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
{{/withPlatformChannelPluginHook}}

class RunnerTests: XCTestCase {

{{#withPlatformChannelPluginHook}}
  func testGetPlatformVersion() {
    let plugin = {{pluginClass}}()

    let call = FlutterMethodCall(methodName: "getPlatformVersion", arguments: [])

    let resultExpectation = expectation(description: "result block must be called.")
    plugin.handle(call) { result in
      XCTAssertEqual(result as! String,
                     "macOS " + ProcessInfo.processInfo.operatingSystemVersionString)
      resultExpectation.fulfill()
    }
    waitForExpectations(timeout: 1)
  }
{{/withPlatformChannelPluginHook}}
{{^withPlatformChannelPluginHook}}
  func testExample() {
    // If you add code to the Runner application, consider adding tests here.
    // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
  }
{{/withPlatformChannelPluginHook}}

}
