Skip to content

Commit 9616362

Browse files
committed
Add error testing
1 parent 5473344 commit 9616362

7 files changed

Lines changed: 232 additions & 10 deletions

File tree

dabest/_dabest_object.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,9 @@ def _check_errors(self, x, y, idx, experiment, experiment_label, x1_level):
471471

472472
# Check if all types are valid
473473
if not valid_types:
474-
raise TypeError("Invalid type found in idx. Expected str, tuple, or list.")
474+
err0 = "`mini_meta` is True, but `idx` ({})".format(idx)
475+
err1 = "does not contain exactly 2 unique columns."
476+
raise ValueError(err0 + err1)
475477

476478
# Handling str type condition
477479
if is_str_condition_met:

dabest/plot_tools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ def single_sankey(
494494
myD["top"] = 1
495495
else:
496496
myD["right"] -= 0.02
497-
myD["bottom"] = rightWidths_norm[right_labelsss[i - 1]]["top"] + 0.02
497+
myD["bottom"] = rightWidths_norm[right_labels[i - 1]]["top"] + 0.02
498498
myD["top"] = myD["bottom"] + myD["right"]
499499
topEdge = myD["top"]
500500
else:

nbs/API/dabest_object.ipynb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,9 @@
541541
"\n",
542542
" # Check if all types are valid\n",
543543
" if not valid_types:\n",
544-
" raise TypeError(\"Invalid type found in idx. Expected str, tuple, or list.\")\n",
544+
" err0 = \"`mini_meta` is True, but `idx` ({})\".format(idx)\n",
545+
" err1 = \"does not contain exactly 2 unique columns.\"\n",
546+
" raise ValueError(err0 + err1)\n",
545547
"\n",
546548
" # Handling str type condition\n",
547549
" if is_str_condition_met:\n",

nbs/API/plot_tools.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@
549549
" myD[\"top\"] = 1\n",
550550
" else:\n",
551551
" myD[\"right\"] -= 0.02\n",
552-
" myD[\"bottom\"] = rightWidths_norm[right_labelsss[i - 1]][\"top\"] + 0.02\n",
552+
" myD[\"bottom\"] = rightWidths_norm[right_labels[i - 1]][\"top\"] + 0.02\n",
553553
" myD[\"top\"] = myD[\"bottom\"] + myD[\"right\"]\n",
554554
" topEdge = myD[\"top\"]\n",
555555
" else:\n",

nbs/tests/data/mocked_data_test_load_errors.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,13 @@
55
random.seed(88888)
66
N = 10
77
c1 = sp.stats.norm.rvs(loc=100, scale=5, size=N)
8-
t1 = sp.stats.norm.rvs(loc=115, scale=5, size=N)
9-
dummy_df = pd.DataFrame({"Control 1": c1, "Test 1": t1})
8+
c2 = sp.stats.norm.rvs(loc=115, scale=5, size=N)
9+
c3 = sp.stats.norm.rvs(loc=3.25, scale=0.4, size=N)
10+
11+
t1 = sp.stats.norm.rvs(loc=3.5, scale=0.5, size=N)
12+
t2 = sp.stats.norm.rvs(loc=2.5, scale=0.6, size=N)
13+
id_col = pd.Series(range(1, N+1))
14+
dummy_df = pd.DataFrame({'Control 1' : c1, 'Test 1' : t1,
15+
'Control 2' : c2, 'Test 2' : t2,
16+
'Control 3' : c3, 'ID' : id_col
17+
})

nbs/tests/test_load_errors.py

Lines changed: 160 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def test_wrong_params_combinations():
1919
my_data = load(
2020
dummy_df,
2121
idx=("Control 1", "Test 1"),
22-
delta2=True,
22+
delta2=True
2323
)
2424
assert error_msg in str(excinfo.value)
2525

@@ -30,7 +30,7 @@ def test_wrong_params_combinations():
3030
x=["Control 1", "Control 1"],
3131
y="Test 1",
3232
delta2=True,
33-
mini_meta=True,
33+
mini_meta=True
3434
)
3535

3636
assert error_msg in str(excinfo.value)
@@ -42,7 +42,7 @@ def test_wrong_params_combinations():
4242
x=["Control 1", "Control 1"],
4343
y="Test 1",
4444
delta2=True,
45-
proportional=True,
45+
proportional=True
4646
)
4747

4848
assert error_msg in str(excinfo.value)
@@ -53,7 +53,164 @@ def test_wrong_params_combinations():
5353
dummy_df,
5454
x=["Control 1", "Control 1"],
5555
idx=("Control 1", "Test 1"),
56+
delta2=True
57+
)
58+
59+
assert error_msg in str(excinfo.value)
60+
61+
error_msg = "`id_col` must be specified if `paired` is assigned with a not NoneType value."
62+
with pytest.raises(IndexError) as excinfo:
63+
my_data = load(
64+
dummy_df, idx=("Control 1", "Test 1"), paired="baseline"
65+
)
66+
67+
assert error_msg in str(excinfo.value)
68+
69+
error_msg = "`delta2` is True but `y` is not indicated."
70+
with pytest.raises(ValueError) as excinfo:
71+
my_data = load(
72+
dummy_df,
73+
x=["Control 1", "Control 1"],
74+
delta2=True
75+
)
76+
77+
78+
def test_param_validations():
79+
error_msg = "`idx` contains duplicated groups. Please remove any duplicates and try again.".format(N)
80+
with pytest.raises(ValueError) as excinfo:
81+
my_data = load(
82+
dummy_df, idx=("Control 1", "Control 1")
83+
)
84+
85+
assert error_msg in str(excinfo.value)
86+
87+
err0 = "Groups are repeated across tuples,"
88+
err1 = " or a tuple has repeated groups in it."
89+
err2 = " Please remove any duplicates and try again."
90+
error_msg = err0 + err1 + err2
91+
with pytest.raises(ValueError) as excinfo:
92+
my_data = load(
93+
dummy_df, idx=(("Control 1", "Control 1", "Test 1"), ("Control 2", "Test 2"))
94+
)
95+
96+
assert error_msg in str(excinfo.value)
97+
98+
wrong_idx = ("Control 1", ("Control 1", "Test 1"))
99+
error_msg = "There seems to be a problem with the idx you " "entered--{}.".format(wrong_idx)
100+
with pytest.raises(ValueError) as excinfo:
101+
my_data = load(
102+
dummy_df, idx=wrong_idx
103+
)
104+
105+
assert error_msg in str(excinfo.value)
106+
107+
wrong_paired = 'not_valid'
108+
error_msg = "{} assigned for `paired` is not valid.".format(wrong_paired)
109+
with pytest.raises(ValueError) as excinfo:
110+
my_data = load(
111+
dummy_df, idx=("Control 1", "Test 1"), paired=wrong_paired, id_col="ID"
112+
)
113+
114+
assert error_msg in str(excinfo.value)
115+
116+
117+
wrong_id_col = 'not_valid'
118+
error_msg = "{} is not a column in `data`. ".format(wrong_id_col)
119+
with pytest.raises(IndexError) as excinfo:
120+
my_data = load(
121+
dummy_df, idx=("Control 1", "Test 1"), paired="baseline", id_col=wrong_id_col
122+
)
123+
124+
assert error_msg in str(excinfo.value)
125+
126+
wrong_idx_mmeta = ("Control 1", "Test 1", "Test 2")
127+
err0 = "`mini_meta` is True, but `idx` ({})".format(wrong_idx_mmeta)
128+
err1 = "does not contain exactly 2 unique columns."
129+
error_msg = err0 + err1
130+
with pytest.raises(ValueError) as excinfo:
131+
my_data = load(
132+
dummy_df, idx=wrong_idx_mmeta, mini_meta=True
133+
)
134+
135+
assert error_msg in str(excinfo.value)
136+
137+
wrong_idx_mmeta = (("Control 1", "Test 1", "Test 2"), ("Control 1", "Control 2", "Test 3"))
138+
err0 = "`mini_meta` is True, but `idx` ({})".format(wrong_idx_mmeta)
139+
err1 = "does not contain exactly 2 unique columns."
140+
error_msg = err0 + err1
141+
with pytest.raises(ValueError) as excinfo:
142+
my_data = load(
143+
dummy_df, idx=wrong_idx_mmeta, mini_meta=True
144+
)
145+
146+
assert error_msg in str(excinfo.value)
147+
148+
wrong_x = ["Control 1", "Control 1", "Control 2"]
149+
error_msg = "`delta2` is True but the number of variables indicated by `x` is {}.".format(len(wrong_x))
150+
with pytest.raises(ValueError) as excinfo:
151+
my_data = load(
152+
dummy_df, x=wrong_x, y="Test 1", delta2=True
153+
)
154+
155+
assert error_msg in str(excinfo.value)
156+
157+
wrong_x = ["Control 4", "Control 5"]
158+
error_msg = "is not a column in `data`. Please check."
159+
with pytest.raises(IndexError) as excinfo:
160+
my_data = load(
161+
dummy_df, x=wrong_x, y="Test 1", delta2=True
162+
)
163+
164+
assert error_msg in str(excinfo.value)
165+
166+
wrong_y = "Test 3"
167+
error_msg = "is not a column in `data`. Please check."
168+
with pytest.raises(IndexError) as excinfo:
169+
my_data = load(
170+
dummy_df, x=["Control 1", "Control 2"], y=wrong_y, delta2=True
171+
)
172+
173+
assert error_msg in str(excinfo.value)
174+
175+
wrong_experiment = "not_valid"
176+
error_msg = "is not a column in `data`. Please check."
177+
with pytest.raises(IndexError) as excinfo:
178+
my_data = load(
179+
dummy_df,
180+
x=["Control 1", "Control 1"],
181+
y="Test 1",
182+
delta2=True,
183+
experiment=wrong_experiment
184+
)
185+
186+
assert error_msg in str(excinfo.value)
187+
188+
#TODO experiment and experiment_label are different
189+
190+
wrong_experiment_label = ["A", "B", "C"]
191+
error_msg = "`experiment_label` does not have a length of 2."
192+
with pytest.raises(ValueError) as excinfo:
193+
my_data = load(
194+
dummy_df,
195+
x=["Control 1", "Control 1"],
196+
y="Test 1",
56197
delta2=True,
198+
experiment="Control 1",
199+
experiment_label=wrong_experiment_label
57200
)
58201

59202
assert error_msg in str(excinfo.value)
203+
204+
wrong_x1_level = "not_valid"
205+
error_msg = "`x1_level` does not have a length of 2."
206+
with pytest.raises(ValueError) as excinfo:
207+
my_data = load(
208+
dummy_df,
209+
x=["Control 1", "Control 1"],
210+
y="Test 1",
211+
delta2=True,
212+
experiment="Control 1",
213+
x1_level=wrong_x1_level
214+
)
215+
216+
assert error_msg in str(excinfo.value)

nbs/tests/test_plot_tools.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
2-
from dabest.plot_tools import get_swarm_spans, width_determine
2+
import pandas as pd
3+
from dabest.plot_tools import get_swarm_spans, width_determine, error_bar, check_data_matches_labels
34
import numpy as np
45

56

@@ -23,3 +24,55 @@ def test_width_determine():
2324
width_determine("some_labels", None)
2425

2526
assert error_msg in str(excinfo.value)
27+
28+
29+
def test_error_bar():
30+
data = pd.DataFrame({
31+
'group': ['A', 'A', 'B', 'B'],
32+
'value': [1, 2, 3, 4]
33+
})
34+
error_msg = "`gap_width_percent` must be between 0 and 100."
35+
with pytest.raises(ValueError) as excinfo:
36+
error_bar(
37+
data=data,
38+
x='group',
39+
y='value',
40+
type='mean_sd',
41+
gap_width_percent=-10 # Invalid as it's less than 0
42+
)
43+
44+
assert error_msg in str(excinfo.value)
45+
46+
error_msg = "Invalid `method`. Must be one of 'gapped_lines', \
47+
'proportional_error_bar', or 'sankey_error_bar'."
48+
with pytest.raises(ValueError) as excinfo:
49+
error_bar(
50+
data=data,
51+
x='group',
52+
y='value',
53+
type='mean_sd',
54+
method='invalid_method' # Invalid as it's not one of the accepted values
55+
)
56+
57+
assert error_msg in str(excinfo.value)
58+
59+
error_msg = "Only accepted values for type are ['mean_sd', 'median_quartiles']"
60+
with pytest.raises(ValueError) as excinfo:
61+
error_bar(
62+
data=data,
63+
x='group',
64+
y='value',
65+
type='invalid_type'
66+
)
67+
68+
assert error_msg in str(excinfo.value)
69+
70+
71+
def test_check_data_matches_labels():
72+
wrong_labels = ['A', 'B', 'C']
73+
wrong_data = pd.Series(['A', 'B', 'D'])
74+
error_msg = "labels and data do not match."
75+
with pytest.raises(Exception) as excinfo:
76+
check_data_matches_labels(wrong_labels, wrong_data, side='left')
77+
78+
assert error_msg in str(excinfo.value)

0 commit comments

Comments
 (0)