2017-10-23 14:06:29 +02:00
|
|
|
import pytest
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
from stix2.confidence.scales import (
|
|
|
|
admiralty_credibility_to_value, dni_to_value, none_low_med_high_to_value,
|
|
|
|
value_to_admiralty_credibility, value_to_dni,
|
|
|
|
value_to_none_low_medium_high, value_to_wep, value_to_zero_ten,
|
|
|
|
wep_to_value, zero_ten_to_value,
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
|
|
|
|
CONFIDENCE_ERROR_STR = "STIX Confidence value cannot be determined for %s"
|
|
|
|
RANGE_ERROR_STR = "Range of values out of bounds: %s"
|
|
|
|
|
|
|
|
|
|
|
|
def _between(x, val, y):
|
|
|
|
return x >= val >= y
|
|
|
|
|
|
|
|
|
|
|
|
def test_confidence_range_none_low_med_high():
|
|
|
|
confidence_range = range(-1, 101)
|
|
|
|
|
|
|
|
for val in confidence_range:
|
|
|
|
if val < 0 or val > 100:
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
value_to_none_low_medium_high(val)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == RANGE_ERROR_STR % val
|
|
|
|
continue
|
|
|
|
|
|
|
|
if val == 0:
|
|
|
|
assert value_to_none_low_medium_high(val) == "None"
|
|
|
|
elif _between(29, val, 1):
|
|
|
|
assert value_to_none_low_medium_high(val) == "Low"
|
|
|
|
elif _between(69, val, 30):
|
|
|
|
assert value_to_none_low_medium_high(val) == "Med"
|
|
|
|
elif _between(100, val, 70):
|
|
|
|
assert value_to_none_low_medium_high(val) == "High"
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value,result", [
|
|
|
|
("None", 0),
|
|
|
|
("Low", 15),
|
|
|
|
("Med", 50),
|
|
|
|
("High", 85),
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_valid_none_low_med_high(scale_value, result):
|
|
|
|
val = none_low_med_high_to_value(scale_value)
|
|
|
|
assert val == result
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value", [
|
|
|
|
"Super",
|
|
|
|
"none",
|
|
|
|
"",
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_invalid_none_low_med_high(scale_value):
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
none_low_med_high_to_value(scale_value)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == CONFIDENCE_ERROR_STR % scale_value
|
|
|
|
|
|
|
|
|
|
|
|
def test_confidence_range_zero_ten():
|
|
|
|
confidence_range = range(-1, 101)
|
|
|
|
|
|
|
|
for val in confidence_range:
|
|
|
|
if val < 0 or val > 100:
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
value_to_zero_ten(val)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == RANGE_ERROR_STR % val
|
|
|
|
continue
|
|
|
|
|
|
|
|
if _between(4, val, 0):
|
|
|
|
assert value_to_zero_ten(val) == "0"
|
|
|
|
elif _between(14, val, 5):
|
|
|
|
assert value_to_zero_ten(val) == "1"
|
|
|
|
elif _between(24, val, 15):
|
|
|
|
assert value_to_zero_ten(val) == "2"
|
|
|
|
elif _between(34, val, 25):
|
|
|
|
assert value_to_zero_ten(val) == "3"
|
|
|
|
elif _between(44, val, 35):
|
|
|
|
assert value_to_zero_ten(val) == "4"
|
|
|
|
elif _between(54, val, 45):
|
|
|
|
assert value_to_zero_ten(val) == "5"
|
|
|
|
elif _between(64, val, 55):
|
|
|
|
assert value_to_zero_ten(val) == "6"
|
|
|
|
elif _between(74, val, 65):
|
|
|
|
assert value_to_zero_ten(val) == "7"
|
|
|
|
elif _between(84, val, 75):
|
|
|
|
assert value_to_zero_ten(val) == "8"
|
|
|
|
elif _between(94, val, 85):
|
|
|
|
assert value_to_zero_ten(val) == "9"
|
|
|
|
elif _between(100, val, 95):
|
|
|
|
assert value_to_zero_ten(val) == "10"
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value,result", [
|
|
|
|
("0", 0),
|
|
|
|
("1", 10),
|
|
|
|
("2", 20),
|
|
|
|
("3", 30),
|
|
|
|
("4", 40),
|
|
|
|
("5", 50),
|
|
|
|
("6", 60),
|
|
|
|
("7", 70),
|
|
|
|
("8", 80),
|
|
|
|
("9", 90),
|
|
|
|
("10", 100),
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_valid_zero_ten(scale_value, result):
|
|
|
|
val = zero_ten_to_value(scale_value)
|
|
|
|
assert val == result
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value", [
|
|
|
|
"11",
|
|
|
|
8,
|
|
|
|
"",
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_invalid_zero_ten(scale_value):
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
zero_ten_to_value(scale_value)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == CONFIDENCE_ERROR_STR % scale_value
|
|
|
|
|
|
|
|
|
|
|
|
def test_confidence_range_admiralty_credibility():
|
|
|
|
confidence_range = range(-1, 101)
|
|
|
|
|
|
|
|
for val in confidence_range:
|
|
|
|
if val < 0 or val > 100:
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
value_to_admiralty_credibility(val)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == RANGE_ERROR_STR % val
|
|
|
|
continue
|
|
|
|
|
|
|
|
if _between(19, val, 0):
|
|
|
|
assert value_to_admiralty_credibility(val) == "5 - Improbable"
|
|
|
|
elif _between(39, val, 20):
|
|
|
|
assert value_to_admiralty_credibility(val) == "4 - Doubtful"
|
|
|
|
elif _between(59, val, 40):
|
|
|
|
assert value_to_admiralty_credibility(val) == "3 - Possibly True"
|
|
|
|
elif _between(79, val, 60):
|
|
|
|
assert value_to_admiralty_credibility(val) == "2 - Probably True"
|
|
|
|
elif _between(100, val, 80):
|
|
|
|
assert value_to_admiralty_credibility(val) == "1 - Confirmed by other sources"
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value,result", [
|
|
|
|
("5 - Improbable", 10),
|
|
|
|
("4 - Doubtful", 30),
|
|
|
|
("3 - Possibly True", 50),
|
|
|
|
("2 - Probably True", 70),
|
|
|
|
("1 - Confirmed by other sources", 90),
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_valid_admiralty_credibility(scale_value, result):
|
|
|
|
val = admiralty_credibility_to_value(scale_value)
|
|
|
|
assert val == result
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value", [
|
|
|
|
"5 - improbable",
|
|
|
|
"6 - Truth cannot be judged",
|
|
|
|
"",
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_invalid_admiralty_credibility(scale_value):
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
admiralty_credibility_to_value(scale_value)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == CONFIDENCE_ERROR_STR % scale_value
|
|
|
|
|
|
|
|
|
|
|
|
def test_confidence_range_wep():
|
|
|
|
confidence_range = range(-1, 101)
|
|
|
|
|
|
|
|
for val in confidence_range:
|
|
|
|
if val < 0 or val > 100:
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
value_to_wep(val)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == RANGE_ERROR_STR % val
|
|
|
|
continue
|
|
|
|
|
|
|
|
if val == 0:
|
|
|
|
assert value_to_wep(val) == "Impossible"
|
|
|
|
elif _between(19, val, 1):
|
|
|
|
assert value_to_wep(val) == "Highly Unlikely/Almost Certainly Not"
|
|
|
|
elif _between(39, val, 20):
|
|
|
|
assert value_to_wep(val) == "Unlikely/Probably Not"
|
|
|
|
elif _between(59, val, 40):
|
|
|
|
assert value_to_wep(val) == "Even Chance"
|
|
|
|
elif _between(79, val, 60):
|
|
|
|
assert value_to_wep(val) == "Likely/Probable"
|
|
|
|
elif _between(99, val, 80):
|
|
|
|
assert value_to_wep(val) == "Highly likely/Almost Certain"
|
|
|
|
elif val == 100:
|
|
|
|
assert value_to_wep(val) == "Certain"
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value,result", [
|
|
|
|
("Impossible", 0),
|
|
|
|
("Highly Unlikely/Almost Certainly Not", 10),
|
|
|
|
("Unlikely/Probably Not", 30),
|
|
|
|
("Even Chance", 50),
|
|
|
|
("Likely/Probable", 70),
|
|
|
|
("Highly likely/Almost Certain", 90),
|
|
|
|
("Certain", 100),
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_valid_wep(scale_value, result):
|
|
|
|
val = wep_to_value(scale_value)
|
|
|
|
assert val == result
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value", [
|
|
|
|
"Unlikely / Probably Not",
|
|
|
|
"Almost certain",
|
|
|
|
"",
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_invalid_wep(scale_value):
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
wep_to_value(scale_value)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == CONFIDENCE_ERROR_STR % scale_value
|
|
|
|
|
|
|
|
|
|
|
|
def test_confidence_range_dni():
|
|
|
|
confidence_range = range(-1, 101)
|
|
|
|
|
|
|
|
for val in confidence_range:
|
|
|
|
if val < 0 or val > 100:
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
value_to_dni(val)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == RANGE_ERROR_STR % val
|
|
|
|
continue
|
|
|
|
|
|
|
|
if _between(9, val, 0):
|
|
|
|
assert value_to_dni(val) == "Almost No Chance / Remote"
|
|
|
|
elif _between(19, val, 10):
|
|
|
|
assert value_to_dni(val) == "Very Unlikely / Highly Improbable"
|
|
|
|
elif _between(39, val, 20):
|
|
|
|
assert value_to_dni(val) == "Unlikely / Improbable"
|
|
|
|
elif _between(59, val, 40):
|
|
|
|
assert value_to_dni(val) == "Roughly Even Change / Roughly Even Odds"
|
|
|
|
elif _between(79, val, 60):
|
|
|
|
assert value_to_dni(val) == "Likely / Probable"
|
|
|
|
elif _between(89, val, 80):
|
|
|
|
assert value_to_dni(val) == "Very Likely / Highly Probable"
|
|
|
|
elif _between(100, val, 90):
|
|
|
|
assert value_to_dni(val) == "Almost Certain / Nearly Certain"
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value,result", [
|
|
|
|
("Almost No Chance / Remote", 5),
|
|
|
|
("Very Unlikely / Highly Improbable", 15),
|
|
|
|
("Unlikely / Improbable", 30),
|
|
|
|
("Roughly Even Change / Roughly Even Odds", 50),
|
|
|
|
("Likely / Probable", 70),
|
|
|
|
("Very Likely / Highly Probable", 85),
|
|
|
|
("Almost Certain / Nearly Certain", 95),
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_valid_dni(scale_value, result):
|
|
|
|
val = dni_to_value(scale_value)
|
|
|
|
assert val == result
|
|
|
|
|
|
|
|
|
2018-07-13 17:10:05 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"scale_value", [
|
|
|
|
"Almost Certain/Nearly Certain",
|
|
|
|
"Almost Certain / nearly Certain",
|
|
|
|
"",
|
|
|
|
],
|
|
|
|
)
|
2017-10-23 14:06:29 +02:00
|
|
|
def test_confidence_scale_invalid_none_dni(scale_value):
|
|
|
|
with pytest.raises(ValueError) as excinfo:
|
|
|
|
dni_to_value(scale_value)
|
|
|
|
|
|
|
|
assert str(excinfo.value) == CONFIDENCE_ERROR_STR % scale_value
|