Newer
Older
from b_asic import (
Absolute,
Addition,
AddSub,
Butterfly,
ComplexConjugate,
Constant,
ConstantMultiplication,
Division,
SquareRoot,
Subtraction,
SymmetricTwoportAdaptor,
)
Angus Lothian
committed
class TestConstant:
Angus Lothian
committed
def test_constant_positive(self):
test_operation = Constant(3)
assert test_operation.evaluate_output(0, []) == 3
Angus Lothian
committed
def test_constant_negative(self):
test_operation = Constant(-3)
assert test_operation.evaluate_output(0, []) == -3
def test_constant_complex(self):
test_operation = Constant(3 + 4j)
assert test_operation.evaluate_output(0, []) == 3 + 4j
Angus Lothian
committed
def test_constant_change_value(self):
test_operation = Constant(3)
assert test_operation.value == 3
test_operation.value = 4
assert test_operation.value == 4
Angus Lothian
committed
class TestAddition:
Angus Lothian
committed
def test_addition_positive(self):
test_operation = Addition()
assert test_operation.evaluate_output(0, [3, 5]) == 8
def test_addition_negative(self):
test_operation = Addition()
assert test_operation.evaluate_output(0, [-3, -5]) == -8
def test_addition_complex(self):
test_operation = Addition()
assert test_operation.evaluate_output(0, [3 + 5j, 4 + 6j]) == 7 + 11j
Angus Lothian
committed
class TestSubtraction:
Angus Lothian
committed
def test_subtraction_positive(self):
test_operation = Subtraction()
assert test_operation.evaluate_output(0, [5, 3]) == 2
def test_subtraction_negative(self):
test_operation = Subtraction()
assert test_operation.evaluate_output(0, [-5, -3]) == -2
def test_subtraction_complex(self):
test_operation = Subtraction()
assert test_operation.evaluate_output(0, [3 + 5j, 4 + 6j]) == -1 - 1j
Angus Lothian
committed
def test_addition_positive(self):
test_operation = AddSub(is_add=True)
assert test_operation.evaluate_output(0, [3, 5]) == 8
def test_addition_negative(self):
test_operation = AddSub(is_add=True)
assert test_operation.evaluate_output(0, [-3, -5]) == -8
def test_addition_complex(self):
test_operation = AddSub(is_add=True)
assert test_operation.evaluate_output(0, [3 + 5j, 4 + 6j]) == 7 + 11j
def test_addsub_subtraction_positive(self):
test_operation = AddSub(is_add=False)
assert test_operation.evaluate_output(0, [5, 3]) == 2
def test_addsub_subtraction_negative(self):
test_operation = AddSub(is_add=False)
assert test_operation.evaluate_output(0, [-5, -3]) == -2
def test_addsub_subtraction_complex(self):
test_operation = AddSub(is_add=False)
assert test_operation.evaluate_output(0, [3 + 5j, 4 + 6j]) == -1 - 1j
def test_addsub_subtraction_is_swappable(self):
test_operation = AddSub(is_add=False)
assert not test_operation.is_swappable
test_operation = AddSub(is_add=True)
assert test_operation.is_swappable
Angus Lothian
committed
class TestMultiplication:
Angus Lothian
committed
def test_multiplication_positive(self):
test_operation = Multiplication()
assert test_operation.evaluate_output(0, [5, 3]) == 15
def test_multiplication_negative(self):
test_operation = Multiplication()
assert test_operation.evaluate_output(0, [-5, -3]) == 15
def test_multiplication_complex(self):
test_operation = Multiplication()
assert test_operation.evaluate_output(0, [3 + 5j, 4 + 6j]) == -18 + 38j
Angus Lothian
committed
class TestDivision:
Angus Lothian
committed
def test_division_positive(self):
test_operation = Division()
assert test_operation.evaluate_output(0, [30, 5]) == 6
def test_division_negative(self):
test_operation = Division()
assert test_operation.evaluate_output(0, [-30, -5]) == 6
def test_division_complex(self):
test_operation = Division()
assert test_operation.evaluate_output(0, [60 + 40j, 10 + 20j]) == 2.8 - 1.6j
Angus Lothian
committed
class TestSquareRoot:
Angus Lothian
committed
def test_squareroot_positive(self):
test_operation = SquareRoot()
assert test_operation.evaluate_output(0, [36]) == 6
def test_squareroot_negative(self):
test_operation = SquareRoot()
assert test_operation.evaluate_output(0, [-36]) == 6j
def test_squareroot_complex(self):
test_operation = SquareRoot()
assert test_operation.evaluate_output(0, [48 + 64j]) == 8 + 4j
Angus Lothian
committed
class TestComplexConjugate:
Angus Lothian
committed
def test_complexconjugate_positive(self):
test_operation = ComplexConjugate()
assert test_operation.evaluate_output(0, [3 + 4j]) == 3 - 4j
Angus Lothian
committed
def test_test_complexconjugate_negative(self):
test_operation = ComplexConjugate()
assert test_operation.evaluate_output(0, [-3 - 4j]) == -3 + 4j
Angus Lothian
committed
class TestMax:
Angus Lothian
committed
def test_max_positive(self):
test_operation = Max()
assert test_operation.evaluate_output(0, [30, 5]) == 30
def test_max_negative(self):
test_operation = Max()
assert test_operation.evaluate_output(0, [-30, -5]) == -5
class TestMin:
Angus Lothian
committed
def test_min_positive(self):
test_operation = Min()
assert test_operation.evaluate_output(0, [30, 5]) == 5
def test_min_negative(self):
test_operation = Min()
assert test_operation.evaluate_output(0, [-30, -5]) == -30
class TestAbsolute:
Angus Lothian
committed
def test_absolute_positive(self):
test_operation = Absolute()
assert test_operation.evaluate_output(0, [30]) == 30
def test_absolute_negative(self):
test_operation = Absolute()
assert test_operation.evaluate_output(0, [-5]) == 5
def test_absolute_complex(self):
test_operation = Absolute()
assert test_operation.evaluate_output(0, [3 + 4j]) == 5.0
Angus Lothian
committed
class TestConstantMultiplication:
Angus Lothian
committed
def test_constantmultiplication_positive(self):
test_operation = ConstantMultiplication(5)
assert test_operation.evaluate_output(0, [20]) == 100
Angus Lothian
committed
def test_constantmultiplication_negative(self):
test_operation = ConstantMultiplication(5)
assert test_operation.evaluate_output(0, [-5]) == -25
def test_constantmultiplication_complex(self):
test_operation = ConstantMultiplication(3 + 2j)
assert test_operation.evaluate_output(0, [3 + 4j]) == 1 + 18j
Angus Lothian
committed
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
class TestRightShift:
"""Tests for RightShift class."""
def test_rightshift_positive(self):
test_operation = RightShift(2)
assert test_operation.evaluate_output(0, [20]) == 5
assert test_operation.value == 2
def test_rightshift_negative(self):
test_operation = RightShift(2)
assert test_operation.evaluate_output(0, [-5]) == -1.25
def test_rightshift_complex(self):
test_operation = RightShift(2)
assert test_operation.evaluate_output(0, [2 + 1j]) == 0.5 + 0.25j
def test_rightshift_errors(self):
with pytest.raises(TypeError, match="value must be an int"):
_ = RightShift(0.5)
test_operation = RightShift(0)
with pytest.raises(TypeError, match="value must be an int"):
test_operation.value = 0.5
with pytest.raises(ValueError, match="value must be non-negative"):
_ = RightShift(-1)
test_operation = RightShift(0)
with pytest.raises(ValueError, match="value must be non-negative"):
test_operation.value = -1
class TestLeftShift:
"""Tests for LeftShift class."""
def test_leftshift_positive(self):
test_operation = LeftShift(2)
assert test_operation.evaluate_output(0, [5]) == 20
assert test_operation.value == 2
def test_leftshift_negative(self):
test_operation = LeftShift(2)
assert test_operation.evaluate_output(0, [-5]) == -20
def test_leftshift_complex(self):
test_operation = LeftShift(2)
assert test_operation.evaluate_output(0, [0.5 + 0.25j]) == 2 + 1j
def test_leftshift_errors(self):
with pytest.raises(TypeError, match="value must be an int"):
_ = LeftShift(0.5)
test_operation = LeftShift(0)
with pytest.raises(TypeError, match="value must be an int"):
test_operation.value = 0.5
with pytest.raises(ValueError, match="value must be non-negative"):
_ = LeftShift(-1)
test_operation = LeftShift(0)
with pytest.raises(ValueError, match="value must be non-negative"):
test_operation.value = -1
class TestShift:
"""Tests for Shift class."""
def test_shift_positive(self):
test_operation = Shift(2)
assert test_operation.evaluate_output(0, [5]) == 20
assert test_operation.value == 2
test_operation = Shift(-2)
assert test_operation.evaluate_output(0, [5]) == 1.25
assert test_operation.value == -2
def test_shift_negative(self):
test_operation = Shift(2)
assert test_operation.evaluate_output(0, [-5]) == -20
test_operation = Shift(-2)
assert test_operation.evaluate_output(0, [-5]) == -1.25
def test_shift_complex(self):
test_operation = Shift(2)
assert test_operation.evaluate_output(0, [0.5 + 0.25j]) == 2 + 1j
test_operation = Shift(-2)
assert test_operation.evaluate_output(0, [2 + 1j]) == 0.5 + 0.25j
@pytest.mark.parametrize("val", (-0.5, 0.5))
def test_leftshift_errors(self, val):
with pytest.raises(TypeError, match="value must be an int"):
_ = Shift(val)
test_operation = Shift(0)
with pytest.raises(TypeError, match="value must be an int"):
test_operation.value = val
Angus Lothian
committed
class TestButterfly:
Angus Lothian
committed
def test_butterfly_positive(self):
test_operation = Butterfly()
assert test_operation.evaluate_output(0, [2, 3]) == 5
assert test_operation.evaluate_output(1, [2, 3]) == -1
def test_butterfly_negative(self):
test_operation = Butterfly()
assert test_operation.evaluate_output(0, [-2, -3]) == -5
assert test_operation.evaluate_output(1, [-2, -3]) == 1
Angus Lothian
committed
test_operation = Butterfly()
assert test_operation.evaluate_output(0, [2 + 1j, 3 - 2j]) == 5 - 1j
assert test_operation.evaluate_output(1, [2 + 1j, 3 - 2j]) == -1 + 3j
Angus Lothian
committed
class TestSymmetricTwoportAdaptor:
def test_symmetrictwoportadaptor_positive(self):
test_operation = SymmetricTwoportAdaptor(0.5)
assert test_operation.evaluate_output(0, [2, 3]) == 3.5
assert test_operation.evaluate_output(1, [2, 3]) == 2.5
def test_symmetrictwoportadaptor_negative(self):
test_operation = SymmetricTwoportAdaptor(0.5)
assert test_operation.evaluate_output(0, [-2, -3]) == -3.5
assert test_operation.evaluate_output(1, [-2, -3]) == -2.5
def test_symmetrictwoportadaptor_complex(self):
test_operation = SymmetricTwoportAdaptor(0.5)
assert test_operation.evaluate_output(0, [2 + 1j, 3 - 2j]) == 3.5 - 3.5j
assert test_operation.evaluate_output(1, [2 + 1j, 3 - 2j]) == 2.5 - 0.5j
def test_symmetrictwoportadaptor_swap_io(self):
test_operation = SymmetricTwoportAdaptor(0.5)
assert test_operation.value == 0.5
test_operation.swap_io()
assert test_operation.value == -0.5
def test_symmetrictwoportadaptor_error(self):
with pytest.raises(ValueError, match="value must be between -1 and 1"):
_ = SymmetricTwoportAdaptor(-2)
test_operation = SymmetricTwoportAdaptor(0)
with pytest.raises(ValueError, match="value must be between -1 and 1"):
test_operation.value = 2
class TestReciprocal:
"""Tests for Absolute class."""
def test_reciprocal_positive(self):
test_operation = Reciprocal()
assert test_operation.evaluate_output(0, [2]) == 0.5
def test_reciprocal_negative(self):
test_operation = Reciprocal()
assert test_operation.evaluate_output(0, [-5]) == -0.2
def test_reciprocal_complex(self):
test_operation = Reciprocal()
assert test_operation.evaluate_output(0, [1 + 1j]) == 0.5 - 0.5j
Angus Lothian
committed
class TestDepends:
def test_depends_addition(self):
add1 = Addition()
assert set(add1.inputs_required_for_output(0)) == {0, 1}
def test_depends_butterfly(self):
bfly1 = Butterfly()
assert set(bfly1.inputs_required_for_output(0)) == {0, 1}
assert set(bfly1.inputs_required_for_output(1)) == {0, 1}
class TestSink:
def test_create_sfg_with_sink(self):
bfly = Butterfly()
sfg = bfly.to_sfg()
s = Sink()
sfg1 = sfg.replace_operation(s, "out0")
assert sfg1.output_count == 1
assert sfg1.input_count == 2
assert sfg.evaluate_output(1, [0, 1]) == sfg1.evaluate_output(0, [0, 1])