{
  "expectation_type" : "expect_column_value_lengths_to_be_between",
  "datasets" : [{
    "data" : {
      "s1":["smart","silly","sassy","slimy","sexy"],
      "s2":["cool","calm","collected","casual","creepy"],
      "s3":["cool","calm","collected","casual", null],
      "s4":[1,2,3,4,5]
    },
    "schemas": {
      "spark": {
        "s1": "StringType",
        "s2": "StringType",
        "s3": "StringType",
        "s4": "IntegerType"
      }
    },
    "tests": [{
      "title": "Positive test, exact min and max",
      "exact_match_out" : false,
      "in":{
        "column": "s1",
        "min_value": 4,
        "max_value": 5
      },
      "out":{
        "success":true,
        "unexpected_index_list": [],
        "unexpected_list": []
      }
    },{
      "title": "Negative test, matching min - max too small",
      "exact_match_out" : false,
      "in":{
        "column": "s2",
        "min_value": 4,
        "max_value": 8
      },
      "out":{
        "success":false,
        "unexpected_index_list": [2],
        "unexpected_list": ["collected"]
      }
    },{
      "title": "Negative test, matching max - min too large",
      "exact_match_out" : false,
      "in":{
        "column": "s2",
        "min_value": 5,
        "max_value": 9
      },
      "out":{
        "success":false,
        "unexpected_index_list": [0, 1],
        "unexpected_list": ["cool", "calm"]
      }
    },{
      "title": "Positive test with null min_value",
      "exact_match_out" : false,
      "in":{
        "column": "s1",
        "min_value": null,
        "max_value": 5
      },
      "out":{
        "success":true,
        "unexpected_index_list": [],
        "unexpected_list": []
      }
    },{
      "title": "Positive test with null max_value",
      "exact_match_out" : false,
      "in":{
        "column": "s1",
        "min_value": 4,
        "max_value": null
      },
      "out":{
        "success":true,
        "unexpected_index_list": [],
        "unexpected_list": []
      }
    },{
      "title": "Negative test with max < min",
      "exact_match_out" : false,
      "in":{
        "column": "s1",
        "min_value": 1,
        "max_value": 0
      },
      "out":{
        "success":false,
        "unexpected_index_list": [0, 1, 2, 3, 4],
        "unexpected_list": ["smart","silly","sassy","slimy","sexy"]
      }
    },{
      "title": "Positive test with missing value in column",
      "exact_match_out" : false,
      "in":{
        "column": "s3",
        "min_value": 4,
        "max_value": 9
      },
      "out":{
        "success": true,
        "unexpected_index_list": [],
        "unexpected_list": []
      }
    },{
      "title": "Test error handling for non-int min_value",
      "exact_match_out" : false,
      "in":{
        "min_value": "quack",
        "max_value": 0,
        "catch_exceptions": true
      },
      "out" : {},
      "error":{
        "traceback_substring": "must be integers"
      }
    },{
      "title": "Test error handling for non-int max_value",
      "exact_match_out" : false,
      "in":{
        "min_value": 0,
        "max_value": "quack",
        "catch_exceptions": true
      },
      "out" : {},
      "error":{
        "traceback_substring": "must be integers"
      }
    },{
      "title": "Test error handling for both null max and min values",
      "exact_match_out" : false,
      "in":{
        "column": "s1",
        "min_value": null,
        "max_value": null,
        "catch_exceptions": true
      },
      "out" : {},
      "error":{
        "traceback_substring": "min_value and max_value cannot both be None"
      }
    },{
      "title": "Test error handling, values are integers",
      "exact_match_out" : false,
      "in":{
        "column": "s4",
        "min_value": 0,
        "max_value": 1,
        "catch_exceptions": true
      },
      "out" : {},
      "error":{
        "traceback_substring": "object of type 'int' has no len()"
      }
    }]
  }]
}