/
fixtures.py
106 lines (80 loc) · 3.18 KB
/
fixtures.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# -*- coding: utf-8 -*-
# Copyright (C) Duncan Macleod (2018-2019)
#
# This file is part of GWpy.
#
# GWpy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GWpy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GWpy. If not, see <http://www.gnu.org/licenses/>.
"""Custom pytest fixtures for GWpy
This module is imported in gwpy.conftest such that all fixtures declared
here are available to test functions/methods by default.
Developer note: **none of the fixtures here should declare autouse=True**.
"""
import pytest
import numpy
from matplotlib import rc_context
from ..plot.tex import HAS_TEX
from ..timeseries import TimeSeries
from .utils import TemporaryFilename
# -- I/O ---------------------------------------------------------------------
@pytest.fixture
def tmpfile():
"""Return a temporary filename using `tempfile.mktemp`.
The fixture **does not create the named file**, but will delete it
when the test exists if it was created in the mean time.
"""
with TemporaryFilename() as tmp:
yield tmp
# -- plotting -----------------------------------------------------------------
SKIP_TEX = pytest.mark.skipif(not HAS_TEX, reason='TeX is not available')
@pytest.fixture(scope='function', params=[
pytest.param(False, id='no-tex'),
pytest.param(True, id='usetex', marks=SKIP_TEX)
])
def usetex(request):
"""Repeat a test with matplotlib's `text.usetex` param False and True.
If TeX is not available on the test machine (determined by
`gwpy.plot.tex.has_tex()`), the usetex=True tests will be skipped.
"""
use_ = request.param
with rc_context(rc={'text.usetex': use_}):
yield use_
# -- various useful mock data series -----------------------------------------
@pytest.fixture
def noisy_sinusoid():
"""10s of 2V/rtHz RMS sine wave at 500Hz with 1mV/rtHz white noise (2kHz)
See :func:`scipy.signal.welch`
"""
# see :func:`scipy.signal.welch`
numpy.random.seed(1234)
# params
freq = 500.
rate = 2048.
size = rate * 10
# create noisy sinusoid
amp = 2 * numpy.sqrt(2) # 2V RMS sinusoid
noise_power = 1e-3 * rate / 2 # mV RMS white noise
time = numpy.arange(size) / rate
x = amp * numpy.sin(2 * numpy.pi * freq * time)
x += numpy.random.normal(scale=numpy.sqrt(noise_power), size=time.shape)
return TimeSeries(x, xindex=time, unit='V', name="noisy sinusoid")
@pytest.fixture
def corrupt_noisy_sinusoid(noisy_sinusoid):
"""The `noisy_sinusoid` but with 10 samples of corruption in the middle
See :func:`scipy.signal.welch`
"""
# add corruption in part of the signal
size = noisy_sinusoid.size
noisy_sinusoid.value[int(size//2):int(size//2)+10] *= 50.
noisy_sinusoid.name = "corrupt noisy sinusoid"
return noisy_sinusoid