/*
 * 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.
 */

/**
 * Unit tests for Python 3.5
 */

plugins { id 'org.apache.beam.module' }
applyPythonNature()

// Required to setup a Python 3 virtualenv.
pythonVersion = '3.5'

task lint {}
check.dependsOn lint

toxTask "lintPy35", "py35-lint"
lint.dependsOn lintPy35

toxTask "testPython35", "py35"
test.dependsOn testPython35

toxTask "testPy35Gcp", "py35-gcp"
test.dependsOn testPy35Gcp

toxTask "testPy35Cython", "py35-cython"
test.dependsOn testPy35Cython
// Ensure that testPy35Cython runs exclusively to other tests. This line is not
// actually required, since gradle doesn't do parallel execution within a
// project.
testPy35Cython.mustRunAfter testPython35, testPy35Gcp

task preCommitPy35() {
    dependsOn "testPython35"
    dependsOn "testPy35Gcp"
    dependsOn "testPy35Cython"
    dependsOn "lint"
}
