/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * License); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an AS IS BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

apply plugin: org.apache.beam.gradle.BeamModulePlugin
applyPythonNature()

tasks.register("mongodbioIT") {
  getVersionsAsList('direct_mongodbio_it_task_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:direct:py${getVersionSuffix(it)}:mongodbioIT")
  }
}

tasks.register("examplesPostCommit") {
  getVersionsAsList('python_versions').each {
    dependsOn.add(":sdks:python:test-suites:direct:py${getVersionSuffix(it)}:examples")
  }
}

task gcpCrossLanguagePostCommit {
  getVersionsAsList('cross_language_validates_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:direct:py${getVersionSuffix(it)}:gcpCrossLanguagePythonUsingJava")
  }
}

task ioCrossLanguagePostCommit {
  getVersionsAsList('cross_language_validates_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:direct:py${getVersionSuffix(it)}:ioCrossLanguagePythonUsingJava")
  }
}

task crossLanguageWrapperValidationPreCommit {
  // Different python versions may output types that look different and lead to
  // false failures. To be consistent, we test on the lowest version only
  def lowestSupportedVersion = getVersionsAsList('cross_language_validates_py_versions')[0]
  dependsOn.add(":sdks:python:test-suites:direct:py${getVersionSuffix(lowestSupportedVersion)}:xlangWrapperValidationPythonUsingJava")
}
