# Path: cotede/qctests/spike_depthconditional.py
# class SpikeDepthConditional(QCCheckVar):
#     def set_features(self):
#         self.features = {"spike": spike(self.data[self.varname])}
# 
#     def test(self):
#         self.flags = {}
# 
#         flag = np.zeros(np.shape(self.data[self.varname]), dtype="i1")
#         feature = self.features["spike"]
# 
#         # ---- Shallow zone -----------------
#         threshold = self.cfg["shallow_max"]
#         flag[
#             np.nonzero(
#                 (np.atleast_1d(self["PRES"]) <= self.cfg["pressure_threshold"])
#                 & (feature > threshold)
#             )
#         ] = self.flag_bad
#         flag[
#             np.nonzero(
#                 (np.atleast_1d(self["PRES"]) <= self.cfg["pressure_threshold"])
#                 & (feature <= threshold)
#             )
#         ] = self.flag_good
#         # ---- Deep zone --------------------
#         threshold = self.cfg["deep_max"]
#         flag[
#             np.nonzero(
#                 (np.atleast_1d(self["PRES"]) > self.cfg["pressure_threshold"])
#                 & (feature > threshold)
#             )
#         ] = self.flag_bad
#         flag[
#             np.nonzero(
#                 (np.atleast_1d(self["PRES"]) > self.cfg["pressure_threshold"])
#                 & (feature <= threshold)
#             )
#         ] = self.flag_good
# 
#         # Flag as 9 any masked input value
#         x = np.atleast_1d(self.data[self.varname])
#         flag[ma.getmaskarray(x) | ~np.isfinite(x)] = 9
#         self.flags["spike_depthconditional"] = flag
# 
# Path: tests/data.py
# class DummyData(object):
#     def __init__(self):
#         self.attrs = {
#                 'datetime': datetime(2016,6,4),
#                 'LATITUDE': 15, 'LONGITUDE': -38}
#         self.data = {
#                 'PRES': ma.fix_invalid(
#                     [2, 6, 10, 21, 44, 79, 100, 150,
#                         200, 400, 410, 650, 1000, 2000, 5000]),
#                 'TEMP': ma.fix_invalid(
#                     [25.32, 25.34, 25.34, 25.31, 24.99, 23.46, 21.85, 17.95,
#                         15.39, 11.08, 6.93, 7.93, 5.71, 3.58, np.nan]),
#                 'PSAL': ma.fix_invalid(
#                     [36.49, 36.51, 36.52, 36.53, 36.59, 36.76, 36.81, 36.39,
#                         35.98, 35.30, 35.28, 34.93, 34.86, np.nan, np.nan])}
# 
#     def __getitem__(self, key):
#         return self.data[key]
# 
#     def keys(self):
#         return self.data.keys()
# 
#     @property
#     def attributes(self):
#         print('attributes will be removed. Use attrs instead!')
#         return self.attrs
# 
# Path: tests/qctests/compare.py
# def compare_input_types(Procedure, cfg):
#     compare_tuple(Procedure, cfg)
#     compare_pandas(Procedure, cfg)
#     compare_xarray(Procedure, cfg)


import numpy as np
from cotede.qctests import SpikeDepthConditional
from ..data import DummyData
from .compare import compare_input_types



def test():
    profile = DummyData()

    cfg = {
        "pressure_threshold": 400,
        "shallow_max": 6,
        "deep_max": 0.05,
        "flag_good": 1,
        "flag_bad": 4,
    }

    y = SpikeDepthConditional(profile, "TEMP", cfg)

    assert isinstance(y.features, dict)
    assert "spike" in y.features
    assert np.allclose(
        y.flags["spike_depthconditional"],
        np.array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 0, 9], dtype="i1"),
    )


def test_input_types():
    cfg = {
        "pressure_threshold": 400,
        "shallow_max": 9,
        "deep_max": 2.5,
    }

# Path: cotede/qctests/spike_depthconditional.py
# class SpikeDepthConditional(QCCheckVar):
#     def set_features(self):
#         self.features = {"spike": spike(self.data[self.varname])}
# 
#     def test(self):
#         self.flags = {}
# 
#         flag = np.zeros(np.shape(self.data[self.varname]), dtype="i1")
#         feature = self.features["spike"]
# 
#         # ---- Shallow zone -----------------
#         threshold = self.cfg["shallow_max"]
#         flag[
#             np.nonzero(
#                 (np.atleast_1d(self["PRES"]) <= self.cfg["pressure_threshold"])
#                 & (feature > threshold)
#             )
#         ] = self.flag_bad
#         flag[
#             np.nonzero(
#                 (np.atleast_1d(self["PRES"]) <= self.cfg["pressure_threshold"])
#                 & (feature <= threshold)
#             )
#         ] = self.flag_good
#         # ---- Deep zone --------------------
#         threshold = self.cfg["deep_max"]
#         flag[
#             np.nonzero(
#                 (np.atleast_1d(self["PRES"]) > self.cfg["pressure_threshold"])
#                 & (feature > threshold)
#             )
#         ] = self.flag_bad
#         flag[
#             np.nonzero(
#                 (np.atleast_1d(self["PRES"]) > self.cfg["pressure_threshold"])
#                 & (feature <= threshold)
#             )
#         ] = self.flag_good
# 
#         # Flag as 9 any masked input value
#         x = np.atleast_1d(self.data[self.varname])
#         flag[ma.getmaskarray(x) | ~np.isfinite(x)] = 9
#         self.flags["spike_depthconditional"] = flag
# 
# Path: tests/data.py
# class DummyData(object):
#     def __init__(self):
#         self.attrs = {
#                 'datetime': datetime(2016,6,4),
#                 'LATITUDE': 15, 'LONGITUDE': -38}
#         self.data = {
#                 'PRES': ma.fix_invalid(
#                     [2, 6, 10, 21, 44, 79, 100, 150,
#                         200, 400, 410, 650, 1000, 2000, 5000]),
#                 'TEMP': ma.fix_invalid(
#                     [25.32, 25.34, 25.34, 25.31, 24.99, 23.46, 21.85, 17.95,
#                         15.39, 11.08, 6.93, 7.93, 5.71, 3.58, np.nan]),
#                 'PSAL': ma.fix_invalid(
#                     [36.49, 36.51, 36.52, 36.53, 36.59, 36.76, 36.81, 36.39,
#                         35.98, 35.30, 35.28, 34.93, 34.86, np.nan, np.nan])}
# 
#     def __getitem__(self, key):
#         return self.data[key]
# 
#     def keys(self):
#         return self.data.keys()
# 
#     @property
#     def attributes(self):
#         print('attributes will be removed. Use attrs instead!')
#         return self.attrs
# 
# Path: tests/qctests/compare.py
# def compare_input_types(Procedure, cfg):
#     compare_tuple(Procedure, cfg)
#     compare_pandas(Procedure, cfg)
#     compare_xarray(Procedure, cfg)


# Path: tests/qctests/test_qc_spike_depthconditional.py
import numpy as np
from cotede.qctests import SpikeDepthConditional
from ..data import DummyData
from .compare import compare_input_types




def test():
    profile = DummyData()

    cfg = {
        "pressure_threshold": 400,
        "shallow_max": 6,
        "deep_max": 0.05,
        "flag_good": 1,
        "flag_bad": 4,
    }

    y = SpikeDepthConditional(profile, "TEMP", cfg)

    assert isinstance(y.features, dict)
    assert "spike" in y.features
    assert np.allclose(
        y.flags["spike_depthconditional"],
        np.array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 0, 9], dtype="i1"),
    )


def test_input_types():
    cfg = {
        "pressure_threshold": 400,
        "shallow_max": 9,
        "deep_max": 2.5,
    }

    compare_input_types(SpikeDepthConditional, cfg)