File: test_argspec.py

package info (click to toggle)
pysoundfile 0.10.3%2Bpost1-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 268 kB
  • sloc: python: 1,789; makefile: 156; sh: 21
file content (79 lines) | stat: -rw-r--r-- 2,474 bytes parent folder | download | duplicates (4)
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
"""Make sure that arguments of open/read/write don't diverge."""

import pytest
import soundfile as sf
import sys


pytestmark = pytest.mark.skipif(sys.version_info < (3, 3),
                                reason="signature module requires Python 3.3")


def defaults(func):
    from inspect import signature
    return dict((k, v) for k, v in signature(func).parameters.items()
                if v.default is not v.empty)


def remove_items(collection, subset):
    """From a collection of defaults, remove a subset and return the rest."""
    the_rest = collection.copy()
    for name, param in subset.items():
        assert (name, the_rest[name].default) == (name, param.default)
        del the_rest[name]
    return the_rest


def test_read_defaults():
    func_defaults = defaults(sf.read)
    meth_defaults = defaults(sf.SoundFile.read)
    init_defaults = defaults(sf.SoundFile.__init__)

    del init_defaults['mode']  # mode is always 'r'

    del func_defaults['start']
    del func_defaults['stop']

    # Same default values as SoundFile.__init__() and SoundFile.read():
    for spec in init_defaults, meth_defaults:
        func_defaults = remove_items(func_defaults, spec)

    assert not func_defaults  # No more arguments should be left


def test_write_defaults():
    write_defaults = defaults(sf.write)
    init_defaults = defaults(sf.SoundFile.__init__)

    # Same default values as SoundFile.__init__()
    init_defaults = remove_items(init_defaults, write_defaults)

    del init_defaults['mode']  # mode is always 'x' or 'w'
    del init_defaults['channels']  # Inferred from data
    del init_defaults['samplerate']  # Obligatory in write()
    assert not init_defaults  # No more arguments should be left


def test_if_blocks_function_and_method_have_same_defaults():
    func_defaults = defaults(sf.blocks)
    meth_defaults = defaults(sf.SoundFile.blocks)
    init_defaults = defaults(sf.SoundFile.__init__)

    del func_defaults['start']
    del func_defaults['stop']
    del init_defaults['mode']

    for spec in init_defaults, meth_defaults:
        func_defaults = remove_items(func_defaults, spec)

    assert not func_defaults


def test_order_of_blocks_arguments():
    from inspect import signature

    # remove 'self':
    meth_args = list(signature(sf.SoundFile.blocks).parameters)[1:]
    meth_args[3:3] = ['start', 'stop']
    func_args = list(signature(sf.blocks).parameters)
    assert func_args[:10] == ['file'] + meth_args