|
| 1 | +from math import nan, inf |
| 2 | + |
| 3 | +from pytest import mark |
| 4 | + |
| 5 | +from graphql.error import INVALID |
| 6 | +from graphql.pyutils import inspect |
| 7 | + |
| 8 | + |
| 9 | +def describe_inspect(): |
| 10 | + def invalid(): |
| 11 | + assert inspect(INVALID) == "<INVALID>" |
| 12 | + |
| 13 | + def none(): |
| 14 | + assert inspect(None) == "None" |
| 15 | + |
| 16 | + def boolean(): |
| 17 | + assert inspect(True) == "True" |
| 18 | + assert inspect(False) == "False" |
| 19 | + |
| 20 | + def string(): |
| 21 | + assert inspect("") == "''" |
| 22 | + assert inspect("abc") == "'abc'" |
| 23 | + assert inspect('"') == repr('"') |
| 24 | + assert inspect("'") == repr("'") |
| 25 | + |
| 26 | + def number(): |
| 27 | + assert inspect(0) == "0" |
| 28 | + assert inspect(0.0) == "0.0" |
| 29 | + assert inspect(314) == "314" |
| 30 | + assert inspect(3.14) == "3.14" |
| 31 | + assert inspect(nan) == "nan" |
| 32 | + assert inspect(inf) == "inf" |
| 33 | + assert inspect(-inf) == "-inf" |
| 34 | + |
| 35 | + def function(): |
| 36 | + assert inspect(lambda: 0) == "<function>" |
| 37 | + |
| 38 | + def test_func(): |
| 39 | + return None |
| 40 | + |
| 41 | + assert inspect(test_func) == "<function test_func>" |
| 42 | + |
| 43 | + def exception(): |
| 44 | + assert inspect(ValueError) == "<exception class ValueError>" |
| 45 | + assert inspect(ArithmeticError(42)) == "<exception ArithmeticError>" |
| 46 | + |
| 47 | + def class_and_method(): |
| 48 | + class TestClass: |
| 49 | + def test_method(self): |
| 50 | + return None |
| 51 | + |
| 52 | + assert inspect(TestClass) == "<class TestClass>" |
| 53 | + assert inspect(TestClass()) == "<TestClass instance>" |
| 54 | + assert inspect(TestClass.test_method) == "<function test_method>" |
| 55 | + assert inspect(TestClass().test_method) == "<method test_method>" |
| 56 | + |
| 57 | + def unknown_object(): |
| 58 | + class MetaClass(type): |
| 59 | + __name__ = None |
| 60 | + |
| 61 | + class TestClass(metaclass=MetaClass): |
| 62 | + pass |
| 63 | + |
| 64 | + assert inspect(TestClass()) == "<object>" |
| 65 | + |
| 66 | + def generator(): |
| 67 | + def test_generator(): |
| 68 | + yield None |
| 69 | + |
| 70 | + assert inspect(test_generator) == "<generator function test_generator>" |
| 71 | + assert inspect(test_generator()) == "<generator test_generator>" |
| 72 | + |
| 73 | + @mark.asyncio |
| 74 | + async def coroutine(): |
| 75 | + async def test_coroutine(): |
| 76 | + return None |
| 77 | + |
| 78 | + assert inspect(test_coroutine) == "<coroutine function test_coroutine>" |
| 79 | + coroutine_object = test_coroutine() |
| 80 | + assert inspect(coroutine_object) == "<coroutine test_coroutine>" |
| 81 | + await coroutine_object # avoid warning |
| 82 | + |
| 83 | + def async_generator(): |
| 84 | + async def test_async_generator(): |
| 85 | + yield None |
| 86 | + |
| 87 | + assert inspect(test_async_generator) == ( |
| 88 | + "<async generator function test_async_generator>" |
| 89 | + ) |
| 90 | + assert inspect(test_async_generator()) == ( |
| 91 | + "<async generator test_async_generator>" |
| 92 | + ) |
| 93 | + |
| 94 | + def lists(): |
| 95 | + assert inspect([]) == "[]" |
| 96 | + assert inspect([None]) == "[None]" |
| 97 | + assert inspect([[[None]]]) == "[[[None]]]" |
| 98 | + assert inspect([1, nan]) == "[1, nan]" |
| 99 | + assert inspect([["a", "b"], "c"]) == "[['a', 'b'], 'c']" |
| 100 | + |
| 101 | + def tuples(): |
| 102 | + assert inspect(()) == "()" |
| 103 | + assert inspect((None,)) == "(None,)" |
| 104 | + assert inspect((((None,),),)) == "(((None,),),)" |
| 105 | + assert inspect((1, nan)) == "(1, nan)" |
| 106 | + assert inspect((("a", "b"), "c")) == "(('a', 'b'), 'c')" |
| 107 | + |
| 108 | + def mixed_lists_and_tuples(): |
| 109 | + assert inspect(["a", ("b",)]) == "['a', ('b',)]" |
| 110 | + |
| 111 | + def mixed_lists_and_tuples_with_various_objects(): |
| 112 | + class TestClass: |
| 113 | + pass |
| 114 | + |
| 115 | + assert inspect([TestClass, (TestClass,), ValueError()]) == ( |
| 116 | + "[<class TestClass>, (<class TestClass>,), <exception ValueError>]" |
| 117 | + ) |
| 118 | + |
| 119 | + def dicts(): |
| 120 | + assert inspect({}) == "{}" |
| 121 | + assert inspect({"a": 1}) == "{'a': 1}" |
| 122 | + assert inspect({"a": 1, "b": 2}) == "{'a': 1, 'b': 2}" |
| 123 | + assert inspect({"list": [None, 0]}) == "{'list': [None, 0]}" |
| 124 | + assert inspect({"a": True, "b": None}) == "{'a': True, 'b': None}" |
| 125 | + |
| 126 | + def sets(): |
| 127 | + assert inspect(set()) == "<empty set>" |
| 128 | + assert inspect({"a"}) == "{'a'}" |
| 129 | + assert inspect({"a", 1}) in ("{'a', 1}", "{1, 'a'}") # sets are unordered |
| 130 | + |
| 131 | + def mixed_dicts_and_sets(): |
| 132 | + assert inspect({"a": {"b"}}) == "{'a': {'b'}}" |
| 133 | + assert inspect({1: [], 2: (), 3: set()}) == "{1: [], 2: (), 3: <empty set>}" |
| 134 | + assert inspect([(set(),), {None: {()}}]) == "[(<empty set>,), {None: {()}}]" |
| 135 | + |
| 136 | + def mixed_dicts_and_sets_with_various_objects(): |
| 137 | + class TestClass: |
| 138 | + pass |
| 139 | + |
| 140 | + assert inspect({TestClass: {ValueError()}, ValueError: {TestClass()}}) == ( |
| 141 | + "{<class TestClass>: {<exception ValueError>}," |
| 142 | + " <exception class ValueError>: {<TestClass instance>}}" |
| 143 | + ) |
0 commit comments