assert isinstance(dir(), list)
assert "__builtins__" in dir()


class A:
    def test():
        pass


a = A()

assert "test" in dir(a), "test not in a"
assert "test" in dir(A), "test not in A"

a.x = 3
assert "x" in dir(a), "x not in a"


class B(A):
    def __dir__(self):
        return ("q", "h")


# Gets sorted and turned into a list
assert ["h", "q"] == dir(B())

# This calls type.__dir__ so isn't changed (but inheritance works)!
assert "test" in dir(A)


# eval() takes any mapping-like type, so dir() must support them
# TODO: eval() should take any mapping as locals, not just dict-derived types
class A(dict):
    def __getitem__(self, x):
        return dir

    def keys(self):
        yield 6
        yield 5


assert eval("dir()", {}, A()) == [5, 6]

import socket

assert "AF_INET" in dir(socket)
