예제 #1
0
def test_write_read_identical(runner, args):
    with runner.isolated_filesystem():
        res1 = runner.invoke(cli, args + " dbsample dbdump write output.svg")
        assert res1.exit_code == 0
        res2 = runner.invoke(cli, "read output.svg dbsample dbdump")
        assert res2.exit_code == 0

    data1 = DebugData.load(res1.output)[0]
    data2 = DebugData.load(res2.output)[0]

    assert data1.count == data2.count
    assert np.isclose(data1.bounds[2] - data1.bounds[0], data2.bounds[2] - data2.bounds[0])
    assert np.isclose(data1.bounds[3] - data1.bounds[1], data2.bounds[3] - data2.bounds[1])
예제 #2
0
def test_rotate_origin(runner):
    res = runner.invoke(
        cli, "random -n 100 -a 10cm 10cm dbsample rotate -o 0 0 90 dbsample dbdump"
    )
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[1].bounds_within(-10 * CM, 0, 10 * CM, 10 * CM)
예제 #3
0
def test_circle(runner):
    result = runner.invoke(cli, "circle -q 0.5mm 0 0 10cm dbsample dbdump")
    data = DebugData.load(result.output)[0]

    assert result.exit_code == 0
    assert data.bounds_within(-10 * CM, -10 * CM, 20 * CM, 20 * CM)
    assert data.count == 1
예제 #4
0
def test_rect(runner):
    result = runner.invoke(cli, "rect 0 0 10cm 10cm dbsample dbdump")
    data = DebugData.load(result.output)[0]

    assert result.exit_code == 0
    assert data.count == 1
    assert data.bounds_within(0, 0, 10 * CM, 10 * CM)
예제 #5
0
def test_crop(runner):
    res = runner.invoke(cli,
                        "random -n 100 -a 10 10 crop 2 2 6 6 dbsample dbdump")
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[0].bounds_within(2, 2, 6, 6)
    assert data[0].count <= 100
예제 #6
0
def test_crop_cm(runner):
    res = runner.invoke(
        cli, "random -n 100 -a 10cm 10cm crop 2cm 2cm 8cm 8cm dbsample dbdump")
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[0].bounds_within(2 * CM, 2 * CM, 8 * CM, 8 * CM)
    assert data[0].count <= 100
예제 #7
0
def test_scale_center(runner):
    res = runner.invoke(
        cli, "random -n 100 -a 10cm 10cm dbsample scale 2 2 dbsample dbdump")
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[0].bounds_within(0, 0, 10 * CM, 10 * CM)
    assert data[1].bounds_within(-5 * CM, -5 * CM, 20 * CM, 20 * CM)
예제 #8
0
def test_translate(runner):
    res = runner.invoke(
        cli, "random -n 100 -a 10cm 10cm dbsample translate 5cm 5cm dbsample dbdump"
    )
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[0].bounds_within(0, 0, 10 * CM, 10 * CM)
    assert data[1].bounds_within(5 * CM, 5 * CM, 10 * CM, 10 * CM)
예제 #9
0
def test_include(runner):
    result = runner.invoke(
        cli, f"-I '{TESTS_DIRECTORY / 'data/include.vpy'}' dbsample dbdump")
    data = DebugData.load(result.output)[0]

    # expecting 4x 100 random lines
    assert result.exit_code == 0
    assert data.count == 400
예제 #10
0
def test_scaleto(runner):
    res = runner.invoke(
        cli, "rect 0 0 10cm 5cm dbsample scaleto -o 0 0 20cm 20cm dbsample dbdump"
    )
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[0].bounds_within(0, 0, 10 * CM, 5 * CM)
    assert data[1].bounds_within(0, 0, 20 * CM, 10 * CM)
예제 #11
0
def test_frame(runner):
    result = runner.invoke(
        cli, "random -n 100 -a 10cm 10cm dbsample frame dbsample frame -o 1cm dbsample dbdump"
    )
    data = DebugData.load(result.output)

    assert result.exit_code == 0
    assert data[0].bounds == data[1].bounds
    assert data[2].count == data[1].count + 1 == data[0].count + 2
예제 #12
0
def test_linemerge(runner, linemerge_args, expected):
    res = runner.invoke(
        cli,
        "line 0 0 0 10 line 0 10.2 0 20 line 30 30 0 20.1 "
        f"linemerge {linemerge_args} dbsample dbdump",
    )
    data = DebugData.load(res.output)[0]
    assert res.exit_code == 0
    assert data.count == expected
예제 #13
0
def test_crop_line_flush(runner):
    # a line whose end intersect with crop bounds is not kept
    # a line flush with crop bounds is kept
    res = runner.invoke(
        cli, "line 100 0 100 10 line 0 5 100 5 crop 100 0 200 200 dbsample dbdump"
    )
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[0].count == 1
예제 #14
0
def test_grid(runner):
    result = runner.invoke(
        cli, "begin grid -o 1cm 1cm 2 2 random -n 10 -a 1cm 1cm end dbsample dbdump"
    )
    data = DebugData.load(result.output)

    assert result.exit_code == 0
    assert data[0].count == 40
    assert data[0].bounds_within(0, 0, 2 * CM, 2 * CM)
예제 #15
0
def test_linesort_no_flip(runner):
    res = runner.invoke(
        cli,
        "line 0 0 0 10 line 0 10 10 10 line 0 0 10 0 line 10 0 10 10 "
        "linesort --no-flip dbsample dbdump",
    )
    # in this situation, an optimal line sorter would have a pen up distance of only 14.14
    # our algo doesnt "see" the second line sequence globally however, thus the added 10 units
    # this would be solved anyway with linemerge
    data = DebugData.load(res.output)[0]
    assert res.exit_code == 0
    assert 24.13 < data.pen_up_length < 24.15
예제 #16
0
def test_linesort_reject_bad_opt(runner):
    res = runner.invoke(
        cli,
        "line 0 0 0 10 line 0 10 10 10 line 0 0 10 0 line 10 0 10 10 "
        f"linesort --no-flip dbsample dbdump",
    )

    # in this situation, the greedy optimizer is worse than the starting position, so its
    # result should be discarded

    data = DebugData.load(res.output)[0]
    assert res.exit_code == 0
    assert data.pen_up_length == pytest.approx(14.1, abs=0.1)
예제 #17
0
def test_linesort_result(runner, opt, expected):
    res = runner.invoke(
        cli,
        "line 20 0 30 0 line 10 0 20 0 line 30 0 40 0 line 0 0 10 0 "
        f"linesort {opt} dbsample dbdump",
    )

    # test situation: four co-linear, single-segment lines in shuffled order
    #
    #    |
    #  0 |  +--4--> +--2--> +--1--> +--3-->
    #    L_____________________________________
    #       0     10      20      30     40

    # the following situation

    data = DebugData.load(res.output)[0]
    assert res.exit_code == 0
    assert data.pen_up_length == pytest.approx(expected)
예제 #18
0
def test_linesort(runner, lines):
    res = runner.invoke(cli, f"{lines} linesort dbsample dbdump")
    data = DebugData.load(res.output)[0]
    assert res.exit_code == 0
    assert data.pen_up_length == 0
예제 #19
0
def test_trim_large_margins2(runner):
    res = runner.invoke(cli, "random -a 10cm 10cm -n 1000 trim 10cm 20cm dbsample dbdump")
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[0].count == 0
예제 #20
0
def test_trim(runner):
    res = runner.invoke(cli, "random -a 10cm 10cm -n 1000 trim 1cm 2cm dbsample dbdump")
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[0].bounds_within(CM, 2 * CM, 9 * CM, 8 * CM)
예제 #21
0
def test_crop_empty2(runner):
    res = runner.invoke(cli, "random -a 10cm 10cm -n 1000 crop 5cm 5cm 0 0 dbsample dbdump")
    data = DebugData.load(res.output)
    assert res.exit_code == 0
    assert data[0].count == 0