def test_natural_boundary_conditions(cond, is_value):
    """test special automatic boundary conditions"""
    g = UnitGrid([2, 2], periodic=[True, False])
    for bc in [
            Boundaries.from_data(g, cond),
            Boundaries.from_data(g, ["periodic", cond]),
    ]:
        assert isinstance(bc[0], BoundaryPeriodic)
        if is_value:
            assert bc[1] == BoundaryPair.from_data(g, 1, "value")
        else:
            assert bc[1] == BoundaryPair.from_data(g, 1, "derivative")
def test_boundary_pair():
    """test setting boundary conditions for whole axis"""
    g = UnitGrid([2, 3])
    b = ["value", {"type": "derivative", "value": 1}]
    for bl, bh in itertools.product(b, b):
        bc = BoundaryPair.from_data(g, 0, [bl, bh])
        blo = BCBase.from_data(g, 0, upper=False, data=bl)
        bho = BCBase.from_data(g, 0, upper=True, data=bh)

        assert bc.low == blo
        assert bc.high == bho
        assert bc == BoundaryPair(blo, bho)
        if bl == bh:
            assert bc == BoundaryPair.from_data(g, 0, bl)
        assert list(bc) == [blo, bho]

        bc.check_value_rank(0)
        with pytest.raises(RuntimeError):
            bc.check_value_rank(1)

    data = {"low": {"value": 1}, "high": {"derivative": 2}}
    bc1 = BoundaryPair.from_data(g, 0, data)
    bc2 = BoundaryPair.from_data(g, 0, data)
    assert bc1 == bc2 and bc1 is not bc2
    bc2 = BoundaryPair.from_data(g, 1, data)
    assert bc1 != bc2 and bc1 is not bc2

    # miscellaneous methods
    data = {"low": {"value": 0}, "high": {"derivative": 0}}
    bc1 = BoundaryPair.from_data(g, 0, data)
    b_lo, b_hi = bc1
    assert b_lo == BCBase.from_data(g, 0, False, {"value": 0})
    assert b_hi == BCBase.from_data(g, 0, True, {"derivative": 0})
    assert b_lo is bc1[0]
    assert b_lo is bc1[False]
    assert b_hi is bc1[1]
    assert b_hi is bc1[True]