Coverage for tests/test_diagnosis.py: 0%

1 import typing

2

3 import numpy as np

4 import pytest

5

6 from swiift.model import frac_handlers

7 from swiift.model.model import WavesUnderFloe

8 from tests.helpers import growth_params_bool, make_growth_params, setup_wuf, wave_params

9

10 strain_handlers = (

11 frac_handlers.BinaryStrainFracture,

12 frac_handlers.MultipleStrainFracture,

13)

14 resolutions = 0.21, 0.03, 1, 1.14, 5

15 coefs_nd = 1, 2, 4, 6

16

17

18@typing.overload

19 def boiler_plate(

20 growth_params_bool: typing.Literal[True],

21 resolution: float,

22 wave_params: tuple[np.ndarray, np.ndarray],

23 fracture_handler: frac_handlers.BinaryFracture,

24) -> tuple[frac_handlers._FractureDiag, WavesUnderFloe, tuple]: ...

25

26

27@typing.overload

28 def boiler_plate(

29 growth_params_bool: None,

30 resolution: float,

31 wave_params: tuple[np.ndarray, np.ndarray],

32 fracture_handler: frac_handlers.BinaryFracture,

33) -> tuple[frac_handlers._FractureDiag, WavesUnderFloe, None]: ...

34

35

36@typing.overload

37 def boiler_plate(

38 growth_params_bool: typing.Literal[True],

39 resolution: float,

40 wave_params: tuple[np.ndarray, np.ndarray],

41 fracture_handler: frac_handlers._StrainFracture,

42) -> tuple[frac_handlers._StrainDiag, WavesUnderFloe, tuple]: ...

43

44

45@typing.overload

46 def boiler_plate(

47 growth_params_bool: None,

48 resolution: float,

49 wave_params: tuple[np.ndarray, np.ndarray],

50 fracture_handler: frac_handlers._StrainFracture,

51) -> tuple[frac_handlers._StrainDiag, WavesUnderFloe, None]: ...

52

53

54 def boiler_plate(growth_params_bool, resolution, wave_params, fracture_handler):

55 growth_params = make_growth_params(growth_params_bool, wave_params)

56 wuf = setup_wuf(wave_params)

57 diag = fracture_handler.diagnose(wuf, resolution, growth_params)

58 return diag, wuf, growth_params

59

60

61@pytest.mark.slow

62@pytest.mark.parametrize("coef_nd", coefs_nd)

63@pytest.mark.parametrize("wave_params", wave_params)

64@pytest.mark.parametrize("growth_params_bool", growth_params_bool)

65@pytest.mark.parametrize("resolution", resolutions)

66 def test_energy(coef_nd, wave_params, growth_params_bool, resolution):

67 diag, wuf, growth_params = boiler_plate(

68 growth_params_bool,

69 resolution,

70 wave_params,

71 frac_handlers.BinaryFracture(coef_nd),

72 )

73 # for energy diagnostics, the bounds of the plate are excluded, so x[0] := Delta x

74 assert diag.x[0] <= resolution

75 assert diag.energy.shape == (diag.x.size, 2)

76 assert hasattr(diag, "initial_energy") and diag.initial_energy == wuf.energy(

77 growth_params

78 )

79 assert (

80 hasattr(diag, "frac_energy_rate")

81 and diag.frac_energy_rate == wuf.wui.ice.frac_energy_rate

82 )

83

84

85@pytest.mark.parametrize("handler", strain_handlers)

86@pytest.mark.parametrize("coef_nd", coefs_nd)

87@pytest.mark.parametrize("wave_params", wave_params)

88@pytest.mark.parametrize("growth_params_bool", growth_params_bool)

89@pytest.mark.parametrize("resolution", resolutions)

90 def test_strain(handler, coef_nd, wave_params, growth_params_bool, resolution):

91 diag, wuf, _ = boiler_plate(

92 growth_params_bool,

93 resolution,

94 wave_params,

95 handler(coef_nd),

96 )

97 # for strain diagnostics, the bounds of the plate are included, so x[1] := Delta x

98 assert diag.x[1] <= resolution

99 assert diag.strain.shape == diag.x.shape

100 assert hasattr(diag, "peaks")

101 assert (

102 hasattr(diag, "strain_extrema")

103 and diag.peaks.shape == diag.strain_extrema.shape

104 )