from recipe_engine import post_process

DEPS = [
    'dart',
]

PYTHON_VERSION_COMPATIBILITY = 'PY3'


def RunSteps(api):
  version_file = api.dart.Version(text='''# Comment
CHANNEL abc
MAJOR 4
MINOR 0
PATCH 2
PRERELEASE 0
PRERELEASE_PATCH 0
UNKNOWN_FIELD cde
''')
  version_file.set_version("1.2.3-4.5.abc")
  assert str(version_file) == '1.2.3-4.5.abc'
  assert version_file == version_file
  assert not version_file < version_file
  assert api.dart.Version('1.2.3') != api.dart.Version('1.2.4')
  assert api.dart.Version('1.2.3-4.0.dev') != api.dart.Version('1.2.3-4.5.beta')
  assert api.dart.Version('1.2.3') < api.dart.Version('1.2.4')
  assert api.dart.Version('1.2.4') > api.dart.Version('1.2.3')
  assert api.dart.Version('1.2.3-0.0.dev') < api.dart.Version('1.2.3')
  assert api.dart.Version('1.2.3') > api.dart.Version('1.2.3-0.0.dev')
  assert api.dart.Version('1.2.3-1.0.dev') < api.dart.Version('1.2.3-0.0.be')
  assert api.dart.Version('1.2.3-0.0.be') > api.dart.Version('1.2.3-1.0.dev')
  assert api.dart.Version('1.2.3-4.5.dev') < api.dart.Version('1.2.3-4.6.beta')
  assert api.dart.Version('1.2.3-4.6.beta') > api.dart.Version('1.2.3-4.5.dev')


def GenTests(api):
  yield api.test(
      'version',
      api.post_process(post_process.StatusSuccess),
      api.post_process(post_process.DropExpectation),
  )
