# 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.

#pylint: disable=no-member, too-many-locals, too-many-branches, no-self-use, broad-except, lost-exception, too-many-nested-blocks, too-few-public-methods, invalid-name
"""
    This file tests and ensures that all tutorials notebooks run
    without warning or exception.

    env variable MXNET_TUTORIAL_TEST_KERNEL controls which kernel to use
    when running the notebook. e.g:
    `export MXNET_TUTORIAL_TEST_KERNEL=python2`

    env variable MXNET_TUTORIAL_TEST_NO_CACHE controls whether to clean the
    temporary directory in which the notebook was run and re-download any
    resource file. The default behaviour is to not clean the directory. Set to '1'
    to force clean the directory. e.g:
    `export MXNET_TUTORIAL_TEST_NO_CACHE=1`
    NB: in the real CI, the tests will re-download everything since they start from
    a clean workspace.
"""
import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'utils'))
from notebook_test import run_notebook

# This is outdated and need to be completely redone.

TUTORIAL_DIR = os.path.join(os.path.dirname(__file__), '..', '..', 'docs', '_build', 'html', 'tutorials')
KERNEL = os.getenv('MXNET_TUTORIAL_TEST_KERNEL', None)
NO_CACHE = os.getenv('MXNET_TUTORIAL_TEST_NO_CACHE', False)

def _test_tutorial_nb(tutorial):
    """Run tutorial Jupyter notebook to catch any execution error.

    Parameters
    ----------
    tutorial : str
        the name of the tutorial to be tested

    Returns
    -------
        True if there are no warnings or errors.
    """
    return run_notebook(tutorial, TUTORIAL_DIR, kernel=KERNEL, no_cache=NO_CACHE)

def test_basic_ndarray():
   assert _test_tutorial_nb('basic/ndarray')

def test_basic_ndarray_indexing():
    assert _test_tutorial_nb('basic/ndarray_indexing')

def test_basic_symbol():
    assert _test_tutorial_nb('basic/symbol')

def test_basic_module():
    assert _test_tutorial_nb('basic/module')

def test_basic_data():
    assert _test_tutorial_nb('basic/data')

def test_basic_reshape_transpose():
       assert _test_tutorial_nb('basic/reshape_transpose')

def test_gluon_customop():
    assert _test_tutorial_nb('gluon/customop')

def test_gluon_custom_layer():
    assert _test_tutorial_nb('gluon/custom_layer')

def test_gluon_transforms():
    assert _test_tutorial_nb('gluon/transforms')

def test_gluon_data_augmentation():
    assert _test_tutorial_nb('gluon/data_augmentation')

def test_gluon_datasets():
    assert _test_tutorial_nb('gluon/datasets')

def test_gluon_naming():
    assert _test_tutorial_nb('gluon/naming')

def test_gluon_ndarray():
    assert _test_tutorial_nb('gluon/ndarray')

def test_gluon_mnist():
    assert _test_tutorial_nb('gluon/mnist')

def test_gluon_autograd():
    assert _test_tutorial_nb('gluon/autograd')

def test_gluon_gluon():
    assert _test_tutorial_nb('gluon/gluon')

def test_gluon_multi_gpu():
    assert _test_tutorial_nb('gluon/multi_gpu')

def test_gluon_save_load_params():
    assert _test_tutorial_nb('gluon/save_load_params')

def test_gluon_hybrid():
    assert _test_tutorial_nb('gluon/hybrid')
# https://github.com/apache/mxnet/issues/16181
"""
def test_gluon_performance():
    assert _test_tutorial_nb('gluon/performance')
"""
def test_gluon_pretrained_models():
    assert _test_tutorial_nb('gluon/pretrained_models')    

def test_gluon_learning_rate_finder():
    assert _test_tutorial_nb('gluon/learning_rate_finder')

def test_gluon_learning_rate_schedules():
    assert _test_tutorial_nb('gluon/learning_rate_schedules')

def test_gluon_learning_rate_schedules_advanced():
    assert _test_tutorial_nb('gluon/learning_rate_schedules_advanced')

def test_gluon_info_gan():
    assert _test_tutorial_nb('gluon/info_gan')

def test_gluon_fit_api_fashion_mnist():
    assert _test_tutorial_nb('gluon/fit_api_tutorial')

def test_nlp_cnn():
    assert _test_tutorial_nb('nlp/cnn')

def test_onnx_super_resolution():
    assert _test_tutorial_nb('onnx/super_resolution')

def test_onnx_export_mxnet_to_onnx():
    assert _test_tutorial_nb('onnx/export_mxnet_to_onnx')

def test_onnx_fine_tuning_gluon():
    assert _test_tutorial_nb('onnx/fine_tuning_gluon')

def test_onnx_inference_on_onnx_model():
    assert _test_tutorial_nb('onnx/inference_on_onnx_model')

def test_python_linear_regression():
    assert _test_tutorial_nb('python/linear-regression')

def test_python_logistic_regression() :
    assert _test_tutorial_nb('gluon/logistic_regression_explained')

def test_python_numpy_gotchas() :
    assert _test_tutorial_nb('gluon/gotchas_numpy_in_mxnet')

def test_gluon_end_to_end():
    assert _test_tutorial_nb('gluon/gluon_from_experiment_to_deployment')

def test_python_mnist():
    assert _test_tutorial_nb('python/mnist')

def test_python_predict_image():
    assert _test_tutorial_nb('python/predict_image')

def test_python_data_augmentation():
    assert _test_tutorial_nb('python/data_augmentation')

def test_python_data_augmentation_with_masks():
    assert _test_tutorial_nb('python/data_augmentation_with_masks')

def test_python_kvstore():
    assert _test_tutorial_nb('python/kvstore')

def test_module_to_gluon():
    assert _test_tutorial_nb('python/module_to_gluon')

def test_python_types_of_data_augmentation():
    assert _test_tutorial_nb('python/types_of_data_augmentation')
#https://github.com/apache/mxnet/issues/16181
"""
def test_python_profiler():
    assert _test_tutorial_nb('python/profiler')
"""
def test_sparse_row_sparse():
    assert _test_tutorial_nb('sparse/row_sparse')

def test_sparse_csr():
    assert _test_tutorial_nb('sparse/csr')

def test_sparse_train():
    assert _test_tutorial_nb('sparse/train')

def test_sparse_train_gluon():
    assert _test_tutorial_nb('sparse/train_gluon')

def test_speech_recognition_ctc():
    assert _test_tutorial_nb('speech_recognition/ctc')

def test_unsupervised_learning_gan():
    assert _test_tutorial_nb('unsupervised_learning/gan')

def test_vision_large_scale_classification():
    assert _test_tutorial_nb('vision/large_scale_classification')

def test_vision_cnn_visualization():
    assert _test_tutorial_nb('vision/cnn_visualization')

def test_control_flow():
    assert _test_tutorial_nb('control_flow/ControlFlowTutorial')

def test_amp():
    assert _test_tutorial_nb('amp/amp_tutorial')
# https://github.com/apache/mxnet/issues/16181
"""
def test_dnnl_quantization():
    assert _test_tutorial_nb('dnnl/dnnl_quantization')
"""
