def test_unofficial_missing_parts_included(file_name):
    key = Path(file_name)

    # Check file not found in official Parts
    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)
    assert key not in file_dic

    # Check file found un Unofficial Parts
    file_dic = FileListDic(
        parts_dir=LDRAW_PARTS_DIR,
        primitives_dir=LDRAW_PRIMITIVES_DIR,
        unofficial_parts_dir=LDRAW_PARTS_DIR_UNOFFICIAL,
        unofficial_primitives_dir=LDRAW_PRIMITIVES_DIR_UNOFFICIAL)
    assert key in file_dic
def test_can_handle_duplicate_unofficial_files():
    duplicate_part_file = '92947.dat'
    key = Path(duplicate_part_file)

    # Check file not found in official Parts
    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)
    assert key in file_dic

    # Check file found un Unofficial Parts
    file_dic = FileListDic(
        parts_dir=LDRAW_PARTS_DIR,
        primitives_dir=LDRAW_PRIMITIVES_DIR,
        unofficial_parts_dir=LDRAW_PARTS_DIR_UNOFFICIAL,
        unofficial_primitives_dir=LDRAW_PRIMITIVES_DIR_UNOFFICIAL)
    assert key in file_dic
def test_calc_top_studs_for_part_list():
    part_list = ['3070b', '71427c01', '32531']
    part_list = [Path(LDRAW_PARTS_DIR) / F'{p}.dat' for p in part_list]

    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)

    top_studs_dic = ldraw_parser.calc_top_studs_for_part_list(
        part_list, file_dic)

    assert len(top_studs_dic) == 3

    # Part 3070b
    assert top_studs_dic['3070b']['top_top_studs'] == 0
    assert top_studs_dic['3070b']['bottom_studs'] == 0
    assert top_studs_dic['3070b']['stud_ring_count'] == 0

    # Part 71427c01
    assert top_studs_dic['71427c01']['top_top_studs'] == 16
    assert top_studs_dic['71427c01'][
        'bottom_studs'] == 0  # on graphic looks like 2 but no files defined
    assert top_studs_dic['71427c01']['stud_ring_count'] == 3

    # Part 32531
    assert top_studs_dic['32531']['top_top_studs'] == 16
    assert top_studs_dic['32531']['bottom_studs'] == 12
    assert top_studs_dic['32531']['stud_ring_count'] == 0
def test_build_dir_finds_top_stud_primitives(file_name):
    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)
    key = Path(file_name)
    assert key in file_dic

    primitives_dir = os.path.join(LDRAW_TEST_FILE_DIR, 'primitives')
    assert Path(primitives_dir) / file_name == file_dic[key]
def test_get_top_studs(top_studs, part_num):
    file_name = F'{part_num}.dat'
    key = Path(file_name)

    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)
    assert key in file_dic
    file_path = file_dic[key]

    processed_files_dic = {}
    ldraw_parser.calc_top_studs_for_part_file(file_path, file_dic,
                                              processed_files_dic)
    assert top_studs == processed_files_dic[file_path]['top_top_studs']
def test_get_stud_ring_count(top_studs, part_num):
    file_name = F'{part_num}.dat'
    key = Path(file_name)

    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)
    assert key in file_dic
    file_path = file_dic[key]

    ldraw_parser.print_sub_files(file_dic[key], file_dic, prefix='stud')

    processed_files_dic = {}
    ldraw_parser.calc_top_studs_for_part_file(file_path, file_dic,
                                              processed_files_dic)
    assert top_studs == processed_files_dic[file_path]['stud_ring_count']
def test_unofficial_file_with_missing_subparts():
    part_with_missing_subs = '91347c01.dat'
    part_with_missing_subs = 'NestedMissingSubfileTest.dat'
    key = Path(part_with_missing_subs)

    file_dic = FileListDic(
        parts_dir=LDRAW_PARTS_DIR,
        primitives_dir=LDRAW_PRIMITIVES_DIR,
        unofficial_parts_dir=LDRAW_PARTS_DIR_UNOFFICIAL,
        unofficial_primitives_dir=LDRAW_PRIMITIVES_DIR_UNOFFICIAL)

    assert key in file_dic
    file_path = file_dic[key]

    with pytest.raises(ldraw_parser.SubfileMissingError):
        ldraw_parser.calc_top_studs_for_part_file(file_path, file_dic)
def test_get_sub_files_from_file():
    file_name = os.path.join('s', '3070bs01.dat')
    key = Path(file_name)

    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)
    assert key in file_dic

    file_path = file_dic[key]
    ldraw_file = ldraw_parser.LdrawFile(file_path)

    sup_part_files = ldraw_file.sup_part_files

    assert len(sup_part_files) == 3
    assert sup_part_files.count(Path('box4.dat')) == 2
    assert sup_part_files.count(Path('box5.dat')) == 1
def test_processed_files_dic_specified():
    file_name = '3024.dat'
    key = Path(file_name)
    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)
    file_path = file_dic[key]
    processed_files_dic = {}

    ldraw_parser.calc_top_studs_for_part_file(file_path, file_dic,
                                              processed_files_dic)
    assert len(processed_files_dic.values()) == 3

    assert processed_files_dic[LDRAW_PARTS_DIR /
                               '3024.dat']['top_top_studs'] == 1
    assert processed_files_dic[LDRAW_PRIMITIVES_DIR /
                               'box5.dat']['top_top_studs'] == 0
    assert processed_files_dic[LDRAW_PRIMITIVES_DIR /
                               'stud.dat']['top_top_studs'] == 1
def test_file_visited_count():
    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)
    file_path = file_dic['3024.dat']
    file_visited_count = {}
    processed_files_dic = {}

    # Run 1st time
    ldraw_parser.calc_top_studs_for_part_file(file_path, file_dic,
                                              processed_files_dic,
                                              file_visited_count)
    assert len(file_visited_count.values()) == 3
    assert file_visited_count[LDRAW_PARTS_DIR / '3024.dat'] == 1
    assert file_visited_count[LDRAW_PRIMITIVES_DIR / 'box5.dat'] == 1
    assert file_visited_count[LDRAW_PRIMITIVES_DIR / 'stud.dat'] == 1

    # Run 2nd time
    ldraw_parser.calc_top_studs_for_part_file(file_path, file_dic,
                                              processed_files_dic,
                                              file_visited_count)
    assert len(file_visited_count.values()) == 3
    assert file_visited_count[LDRAW_PARTS_DIR / '3024.dat'] == 2
    assert file_visited_count[LDRAW_PRIMITIVES_DIR / 'box5.dat'] == 1
    assert file_visited_count[LDRAW_PRIMITIVES_DIR / 'stud.dat'] == 1
def test_find_subdir_file():
    file_name = Path('s/10s01.dat')
    file_dic = FileListDic(parts_dir=LDRAW_PARTS_DIR,
                           primitives_dir=LDRAW_PRIMITIVES_DIR)
    key = Path(file_name)
    assert key in file_dic