# Copyright (c) OpenMMLab. All rights reserved. import json import os.path as osp import tempfile import pytest from mmocr.datasets.utils.backend import (HardDiskAnnFileBackend, HTTPAnnFileBackend, PetrelAnnFileBackend) from mmocr.datasets.utils.loader import (AnnFileLoader, HardDiskLoader, LmdbLoader) from mmocr.utils import lmdb_converter def _create_dummy_line_str_file(ann_file): ann_info1 = 'sample1.jpg hello' ann_info2 = 'sample2.jpg world' with open(ann_file, 'w') as fw: for ann_info in [ann_info1, ann_info2]: fw.write(ann_info + '\n') def _create_dummy_line_json_file(ann_file): ann_info1 = {'filename': 'sample1.jpg', 'text': 'hello'} ann_info2 = {'filename': 'sample2.jpg', 'text': 'world'} with open(ann_file, 'w') as fw: for ann_info in [ann_info1, ann_info2]: fw.write(json.dumps(ann_info) + '\n') def test_loader(): tmp_dir = tempfile.TemporaryDirectory() # create dummy data ann_file = osp.join(tmp_dir.name, 'fake_data.txt') _create_dummy_line_str_file(ann_file) parser = dict( type='LineStrParser', keys=['filename', 'text'], keys_idx=[0, 1], separator=' ') with pytest.raises(AssertionError): AnnFileLoader(ann_file, parser, repeat=0) with pytest.raises(AssertionError): AnnFileLoader(ann_file, [], repeat=1) # test text loader and line str parser text_loader = HardDiskLoader(ann_file, parser, repeat=1) assert len(text_loader) == 2 assert text_loader.ori_data_infos[0] == 'sample1.jpg hello' assert text_loader[0] == {'filename': 'sample1.jpg', 'text': 'hello'} # test text loader and linedict parser _create_dummy_line_json_file(ann_file) json_parser = dict(type='LineJsonParser', keys=['filename', 'text']) text_loader = HardDiskLoader(ann_file, json_parser, repeat=1) assert text_loader[0] == {'filename': 'sample1.jpg', 'text': 'hello'} # test text loader and linedict parser _create_dummy_line_json_file(ann_file) json_parser = dict(type='LineJsonParser', keys=['filename', 'text']) text_loader = HardDiskLoader(ann_file, json_parser, repeat=1) it = iter(text_loader) with pytest.raises(StopIteration): for _ in range(len(text_loader) + 1): next(it) # test lmdb loader and line str parser _create_dummy_line_str_file(ann_file) lmdb_file = osp.join(tmp_dir.name, 'fake_data.lmdb') lmdb_converter(ann_file, lmdb_file, lmdb_map_size=102400) lmdb_loader = LmdbLoader(lmdb_file, parser, repeat=1) assert lmdb_loader[0] == {'filename': 'sample1.jpg', 'text': 'hello'} lmdb_loader.close() with pytest.raises(AssertionError): HardDiskAnnFileBackend(file_format='json') with pytest.raises(AssertionError): PetrelAnnFileBackend(file_format='json') with pytest.raises(AssertionError): HTTPAnnFileBackend(file_format='json') tmp_dir.cleanup()