enum E {
  case first
  case second
  case third
  case fourth
}

func someFunc(e: E) {
  if e == .first {
    print("first")
  } else if e == .second {
    print("second")
  }
  else {
    print("default")
  }
}

func twoStringBody(e: E) {
  if e == .first {
    print("first string")
    print("second string")
  } else {
    print("default")
  }
}

func withoutElse(e: E) {
  if e == .first {
    print("first")
  } else if e == .second {
    print("second")
  } else if e == .third {
    print("third")
  }
}

func checkInverseCondition(e: E) {
  if .first == e {
    print("first")
  } else if .second == e {
    print("second")
  } else {
    print("default")
  }
}

func checkCaseCondition() {
  let someOptional: Int? = 42
  if case .some(let x) = someOptional {
    print(x)
  }

  if case let x? = someOptional {
    print(x)
  }
}

func checkOptionalBindingCondition(optional: String?) {
  if let unwrapped = optional {
    print(unwrapped)
  }

  if var unwrapped = optional {
    unwrapped += "!"
    print(unwrapped)
  }
}

func checkMultipleOrConditions(e: E) {
  if e == .first || e == .second || e == .third {
    print("1-3")
  } else if e == .fourth { 
    print("4")
  } else { 
    print(">4")
  }
}

enum Foo { case a, b, c }
func checkLabeledCondition(e: Foo, f: Foo) {
  outerLabel: if e == .a {
    innerLabel: switch f {
    case .a:
      break outerLabel
    default:
      break innerLabel
    }
    print("outside switch")
  }
  print("outside if")
}

enum Barcode {
  case upc(Int, Int, Int, Int)
  case qrCode(String)
}
func checkEnumWithAssociatedValues(productBarcode: Barcode) {
  if case .upc(let numberSystem, let manufacturer, let product, let check) = productBarcode {
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
  } else if case let .qrCode(productCode) = productBarcode {
    print("QR code: \(productCode).")
  }
}

struct MyType: Equatable { let v: String }
func checkEquatableProtocol(x: Int, y: MyType) {
  if x == 5 {
    print("5")
  } else if x == 4 {
    print("4")
  } else if 1...3 ~= x {
    print("1...3")
  } else {
    print("default")
  }

  if y == MyType(v: "bye") {
    print("bye")
  } else if y == MyType(v: "tchau") {
    print("tchau")
  } else {
    print("default")
  }
}

func checkEmptyBody(e: E) {
  if e == .first {}
  else if e == .second {
    print("second")
  }
}

// RUN: %empty-directory(%t.result)

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=9:3 -end-pos=16:4 > %t.result/L9-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L9-3.swift
// RUN: diff -u %S/Outputs/basic/L9-3.swift.expected %t.result/L9-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=20:3 -end-pos=25:4 > %t.result/L20-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L20-3.swift
// RUN: diff -u %S/Outputs/basic/L20-3.swift.expected %t.result/L20-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=29:3 -end-pos=35:4 > %t.result/L29-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L29-3.swift
// RUN: diff -u %S/Outputs/basic/L29-3.swift.expected %t.result/L29-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=39:3 -end-pos=45:4 > %t.result/L39-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L39-3.swift
// RUN: diff -u %S/Outputs/basic/L39-3.swift.expected %t.result/L39-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=50:3 -end-pos=52:4 > %t.result/L50-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L50-3.swift
// RUN: diff -u %S/Outputs/basic/L50-3.swift.expected %t.result/L50-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=54:3 -end-pos=56:4 > %t.result/L54-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L54-3.swift
// RUN: diff -u %S/Outputs/basic/L54-3.swift.expected %t.result/L54-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=60:3 -end-pos=62:4 > %t.result/L60-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L60-3.swift
// RUN: diff -u %S/Outputs/basic/L60-3.swift.expected %t.result/L60-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=64:3 -end-pos=67:4 > %t.result/L64-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L64-3.swift
// RUN: diff -u %S/Outputs/basic/L64-3.swift.expected %t.result/L64-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=71:3 -end-pos=77:4 > %t.result/L71-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L71-3.swift
// RUN: diff -u %S/Outputs/basic/L71-3.swift.expected %t.result/L71-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=82:3 -end-pos=90:4 > %t.result/L82-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L82-3.swift
// RUN: diff -u %S/Outputs/basic/L82-3.swift.expected %t.result/L82-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=99:3 -end-pos=103:4 > %t.result/L99-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L99-3.swift
// RUN: diff -u %S/Outputs/basic/L99-3.swift.expected %t.result/L99-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=108:3 -end-pos=116:4 > %t.result/L108-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L108-3.swift
// RUN: diff -u %S/Outputs/basic/L108-3.swift.expected %t.result/L108-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=118:3 -end-pos=124:4 > %t.result/L118-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L118-3.swift
// RUN: diff -u %S/Outputs/basic/L118-3.swift.expected %t.result/L118-3.swift

// RUN: %refactor -convert-to-switch-stmt -source-filename %s -pos=128:3 -end-pos=131:4 > %t.result/L128-3.swift
// RUN: %target-swift-frontend-typecheck %t.result/L128-3.swift
// RUN: diff -u %S/Outputs/basic/L128-3.swift.expected %t.result/L128-3.swift
