Example #1
0
def build(chp_csv_path=None, db_path=None):

    # use default path if either path is not given.

    if chp_csv_path is None:
        chp_csv_path = _chp_csv_path
    if db_path is None:
        db_path = _db_path

    # build the index

    dir_ = Directory(db_path)
    with open(chp_csv_path) as csv_f:
        dir_.load_chp_csv(csv_f)
Example #2
0
def build(chp_csv_path=None, db_path=None):

    # use default path if either path is not given.

    if chp_csv_path is None:
        chp_csv_path = _chp_csv_path
    if db_path is None:
        db_path = _db_path

    # build the index

    dir_ = Directory(db_path)
    with open(chp_csv_path) as csv_f:
        dir_.load_chp_csv(csv_f)
Example #3
0
    def put_gradual(self, addr_str, zipcode):

        self.cur.execute('''
            select zipcode
            from   gradual
            where  addr_str = ?;
        ''', (addr_str,))

        row = self.cur.fetchone()
        if row is None:
            stored_zipcode = None
        else:
            stored_zipcode = row[0]

        self.cur.execute('replace into gradual values (?, ?);', (
            addr_str,
            Directory.get_common_part(stored_zipcode, zipcode),
        ))

        return self.cur.rowcount
Example #4
0
    def put_gradual(self, addr_str, zipcode):

        self.cur.execute(
            '''
            select zipcode
            from   gradual
            where  addr_str = ?;
        ''', (addr_str, ))

        row = self.cur.fetchone()
        if row is None:
            stored_zipcode = None
        else:
            stored_zipcode = row[0]

        self.cur.execute('replace into gradual values (?, ?);', (
            addr_str,
            Directory.get_common_part(stored_zipcode, zipcode),
        ))

        return self.cur.rowcount
Example #5
0
    def setup(self):

        chp_csv_lines = io.BytesIO('''郵遞區號,縣市名稱,鄉鎮市區,原始路名,投遞範圍
10058,臺北市,中正區,八德路1段,全
10079,臺北市,中正區,三元街,單全
10070,臺北市,中正區,三元街,雙  48號以下
10079,臺北市,中正區,三元街,雙  50號以上
10068,臺北市,中正區,大埔街,單  15號以上
10068,臺北市,中正區,大埔街,雙  36號以上
10051,臺北市,中正區,中山北路1段,單   3號以下
10041,臺北市,中正區,中山北路1段,雙  48號以下
10051,臺北市,中正區,中山南路,單   5號以下
10041,臺北市,中正區,中山南路,雙  18號以下
10002,臺北市,中正區,中山南路,    7號
10051,臺北市,中正區,中山南路,    9號
10048,臺北市,中正區,中山南路,單  11號以上
10001,臺北市,中正區,中山南路,   20號
10043,臺北市,中正區,中華路1段,單  25之   3號以下
10042,臺北市,中正區,中華路1段,單  27號至  47號
10010,臺北市,中正區,中華路1段,   49號
10042,臺北市,中正區,中華路1段,單  51號以上
10065,臺北市,中正區,中華路2段,單  79號以下
10066,臺北市,中正區,中華路2段,單  81號至 101號
10068,臺北市,中正區,中華路2段,單 103號至 193號
10069,臺北市,中正區,中華路2段,單 195號至 315號
10067,臺北市,中正區,中華路2段,單 317號至 417號
10072,臺北市,中正區,中華路2段,單 419號以上
10055,臺北市,中正區,丹陽街,全
10051,臺北市,中正區,仁愛路1段,    1號
10052,臺北市,中正區,仁愛路1段,連   2之   4號以上
10055,臺北市,中正區,仁愛路2段,單  37號以下
10060,臺北市,中正區,仁愛路2段,雙  48號以下
10056,臺北市,中正區,仁愛路2段,單  39號至  49號
10056,臺北市,中正區,仁愛路2段,雙  48之   1號至  64號
10062,臺北市,中正區,仁愛路2段,單  51號以上
10063,臺北市,中正區,仁愛路2段,雙  66號以上
20201,基隆市,中正區,義一路,    1號
20241,基隆市,中正區,義一路,連   2號以上
20250,基隆市,中正區,義二路,全
20241,基隆市,中正區,義三路,單全
20248,基隆市,中正區,漁港一街,全
20249,基隆市,中正區,漁港二街,全
20249,基隆市,中正區,漁港三街,全
20249,基隆市,中正區,調和街,全
20248,基隆市,中正區,環港街,全
20243,基隆市,中正區,豐稔街,全
20249,基隆市,中正區,觀海街,全
36046,苗栗縣,苗栗市,大埔街,全
81245,高雄市,小港區,豐田街,全
81245,高雄市,小港區,豐登街,全
81245,高雄市,小港區,豐善街,全
81245,高雄市,小港區,豐街,全
81245,高雄市,小港區,豐點街,全
81257,高雄市,小港區,寶山街,全
81362,高雄市,左營區,大中一路,單 331號以上
81362,高雄市,左營區,大中一路,雙 386號以上
81362,高雄市,左營區,大中二路,單 241號以下
81368,高雄市,左營區,大中二路,雙 200號以下
81369,高雄市,左營區,大中二路,雙 202號至 698號
81369,高雄市,左營區,大中二路,單 243號至 479號
81365,高雄市,左營區,大中二路,單 481號以上
81354,高雄市,左營區,大中二路,雙 700號以上
81357,高雄市,左營區,大順一路,單  91號至  95號
81357,高雄市,左營區,大順一路,雙  96號至 568號
81357,高雄市,左營區,大順一路,單 201號至 389巷'''.encode('utf-8'))

        self.dir_ = Directory(':memory:', keep_alive=True)
        self.dir_.load_chp_csv(chp_csv_lines)
Example #6
0
class TestDirectory(object):
    def setup(self):

        chp_csv_lines = io.BytesIO('''郵遞區號,縣市名稱,鄉鎮市區,原始路名,投遞範圍
10058,臺北市,中正區,八德路1段,全
10079,臺北市,中正區,三元街,單全
10070,臺北市,中正區,三元街,雙  48號以下
10079,臺北市,中正區,三元街,雙  50號以上
10068,臺北市,中正區,大埔街,單  15號以上
10068,臺北市,中正區,大埔街,雙  36號以上
10051,臺北市,中正區,中山北路1段,單   3號以下
10041,臺北市,中正區,中山北路1段,雙  48號以下
10051,臺北市,中正區,中山南路,單   5號以下
10041,臺北市,中正區,中山南路,雙  18號以下
10002,臺北市,中正區,中山南路,    7號
10051,臺北市,中正區,中山南路,    9號
10048,臺北市,中正區,中山南路,單  11號以上
10001,臺北市,中正區,中山南路,   20號
10043,臺北市,中正區,中華路1段,單  25之   3號以下
10042,臺北市,中正區,中華路1段,單  27號至  47號
10010,臺北市,中正區,中華路1段,   49號
10042,臺北市,中正區,中華路1段,單  51號以上
10065,臺北市,中正區,中華路2段,單  79號以下
10066,臺北市,中正區,中華路2段,單  81號至 101號
10068,臺北市,中正區,中華路2段,單 103號至 193號
10069,臺北市,中正區,中華路2段,單 195號至 315號
10067,臺北市,中正區,中華路2段,單 317號至 417號
10072,臺北市,中正區,中華路2段,單 419號以上
10055,臺北市,中正區,丹陽街,全
10051,臺北市,中正區,仁愛路1段,    1號
10052,臺北市,中正區,仁愛路1段,連   2之   4號以上
10055,臺北市,中正區,仁愛路2段,單  37號以下
10060,臺北市,中正區,仁愛路2段,雙  48號以下
10056,臺北市,中正區,仁愛路2段,單  39號至  49號
10056,臺北市,中正區,仁愛路2段,雙  48之   1號至  64號
10062,臺北市,中正區,仁愛路2段,單  51號以上
10063,臺北市,中正區,仁愛路2段,雙  66號以上
20201,基隆市,中正區,義一路,    1號
20241,基隆市,中正區,義一路,連   2號以上
20250,基隆市,中正區,義二路,全
20241,基隆市,中正區,義三路,單全
20248,基隆市,中正區,漁港一街,全
20249,基隆市,中正區,漁港二街,全
20249,基隆市,中正區,漁港三街,全
20249,基隆市,中正區,調和街,全
20248,基隆市,中正區,環港街,全
20243,基隆市,中正區,豐稔街,全
20249,基隆市,中正區,觀海街,全
36046,苗栗縣,苗栗市,大埔街,全
81245,高雄市,小港區,豐田街,全
81245,高雄市,小港區,豐登街,全
81245,高雄市,小港區,豐善街,全
81245,高雄市,小港區,豐街,全
81245,高雄市,小港區,豐點街,全
81257,高雄市,小港區,寶山街,全
81362,高雄市,左營區,大中一路,單 331號以上
81362,高雄市,左營區,大中一路,雙 386號以上
81362,高雄市,左營區,大中二路,單 241號以下
81368,高雄市,左營區,大中二路,雙 200號以下
81369,高雄市,左營區,大中二路,雙 202號至 698號
81369,高雄市,左營區,大中二路,單 243號至 479號
81365,高雄市,左營區,大中二路,單 481號以上
81354,高雄市,左營區,大中二路,雙 700號以上
81357,高雄市,左營區,大順一路,單  91號至  95號
81357,高雄市,左營區,大順一路,雙  96號至 568號
81357,高雄市,左營區,大順一路,單 201號至 389巷'''.encode('utf-8'))

        self.dir_ = Directory(':memory:', keep_alive=True)
        self.dir_.load_chp_csv(chp_csv_lines)

    def test_find(self):

        # It retuns a partial zipcode when the address doesn't match any rule in
        # our directory.

        # 10043,臺北市,中正區,中華路1段,單  25之   3號以下
        assert self.dir_.find('臺北市中正區中華路1段25號') == '10043'
        assert self.dir_.find('臺北市中正區中華路1段25-2號') == '10043'
        assert self.dir_.find('臺北市中正區中華路1段25-3號') == '10043'
        assert self.dir_.find('臺北市中正區中華路1段25-4號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段26號') == '100'

        # 10042,臺北市,中正區,中華路1段,單  27號至  47號
        assert self.dir_.find('臺北市中正區中華路1段25號') == '10043'
        assert self.dir_.find('臺北市中正區中華路1段26號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段27號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段28號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段29號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段45號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段46號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段47號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段48號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段49號') == '10010'

        # 10010,臺北市,中正區,中華路1段,   49號
        assert self.dir_.find('臺北市中正區中華路1段48號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段49號') == '10010'
        assert self.dir_.find('臺北市中正區中華路1段50號') == '100'

        # 10042,臺北市,中正區,中華路1段,單  51號以上
        assert self.dir_.find('臺北市中正區中華路1段49號') == '10010'
        assert self.dir_.find('臺北市中正區中華路1段50號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段51號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段52號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段53號') == '10042'

    def test_find_gradually(self):

        assert self.dir_.find('臺北市') == '100'
        assert self.dir_.find('臺北市中正區') == '100'
        assert self.dir_.find('臺北市中正區仁愛路1段') == '1005'
        assert self.dir_.find('臺北市中正區仁愛路1段1號') == '10051'

    def test_find_middle_token(self):

        assert self.dir_.find('左營區') == '813'
        assert self.dir_.find('大中一路') == '81362'
        assert self.dir_.find('大中二路') == '813'
        assert self.dir_.find('左營區大中一路') == '81362'
        assert self.dir_.find('左營區大中二路') == '813'

        assert self.dir_.find('小港區') == '812'
        assert self.dir_.find('豐街') == '81245'
        assert self.dir_.find('小港區豐街') == '81245'

        assert self.dir_.find('中正區') == ''

        assert self.dir_.find('大埔街') == ''
        assert self.dir_.find('台北市大埔街') == '10068'
        assert self.dir_.find('苗栗縣大埔街') == '36046'
Example #7
0
    def setup(self):

        chp_csv_lines = '''郵遞區號,縣市名稱,鄉鎮市區,原始路名,投遞範圍
10058,臺北市,中正區,八德路1段,全
10079,臺北市,中正區,三元街,單全
10070,臺北市,中正區,三元街,雙  48號以下
10079,臺北市,中正區,三元街,雙  50號以上
10068,臺北市,中正區,大埔街,單  15號以上
10068,臺北市,中正區,大埔街,雙  36號以上
10051,臺北市,中正區,中山北路1段,單   3號以下
10041,臺北市,中正區,中山北路1段,雙  48號以下
10051,臺北市,中正區,中山南路,單   5號以下
10041,臺北市,中正區,中山南路,雙  18號以下
10002,臺北市,中正區,中山南路,    7號
10051,臺北市,中正區,中山南路,    9號
10048,臺北市,中正區,中山南路,單  11號以上
10001,臺北市,中正區,中山南路,   20號
10043,臺北市,中正區,中華路1段,單  25之   3號以下
10042,臺北市,中正區,中華路1段,單  27號至  47號
10010,臺北市,中正區,中華路1段,   49號
10042,臺北市,中正區,中華路1段,單  51號以上
10065,臺北市,中正區,中華路2段,單  79號以下
10066,臺北市,中正區,中華路2段,單  81號至 101號
10068,臺北市,中正區,中華路2段,單 103號至 193號
10069,臺北市,中正區,中華路2段,單 195號至 315號
10067,臺北市,中正區,中華路2段,單 317號至 417號
10072,臺北市,中正區,中華路2段,單 419號以上
10055,臺北市,中正區,丹陽街,全
10051,臺北市,中正區,仁愛路1段,    1號
10052,臺北市,中正區,仁愛路1段,連   2之   4號以上
10055,臺北市,中正區,仁愛路2段,單  37號以下
10060,臺北市,中正區,仁愛路2段,雙  48號以下
10056,臺北市,中正區,仁愛路2段,單  39號至  49號
10056,臺北市,中正區,仁愛路2段,雙  48之   1號至  64號
10062,臺北市,中正區,仁愛路2段,單  51號以上
10063,臺北市,中正區,仁愛路2段,雙  66號以上
20201,基隆市,中正區,義一路,    1號
20241,基隆市,中正區,義一路,連   2號以上
20250,基隆市,中正區,義二路,全
20241,基隆市,中正區,義三路,單全
20248,基隆市,中正區,漁港一街,全
20249,基隆市,中正區,漁港二街,全
20249,基隆市,中正區,漁港三街,全
20249,基隆市,中正區,調和街,全
20248,基隆市,中正區,環港街,全
20243,基隆市,中正區,豐稔街,全
20249,基隆市,中正區,觀海街,全
36046,苗栗縣,苗栗市,大埔街,全
81245,高雄市,小港區,豐田街,全
81245,高雄市,小港區,豐登街,全
81245,高雄市,小港區,豐善街,全
81245,高雄市,小港區,豐街,全
81245,高雄市,小港區,豐點街,全
81257,高雄市,小港區,寶山街,全
81362,高雄市,左營區,大中一路,單 331號以上
81362,高雄市,左營區,大中一路,雙 386號以上
81362,高雄市,左營區,大中二路,單 241號以下
81368,高雄市,左營區,大中二路,雙 200號以下
81369,高雄市,左營區,大中二路,雙 202號至 698號
81369,高雄市,左營區,大中二路,單 243號至 479號
81365,高雄市,左營區,大中二路,單 481號以上
81354,高雄市,左營區,大中二路,雙 700號以上
81357,高雄市,左營區,大順一路,單  91號至  95號
81357,高雄市,左營區,大順一路,雙  96號至 568號
81357,高雄市,左營區,大順一路,單 201號至 389巷'''.split('\n')

        self.dir_ = Directory(':memory:', keep_alive=True)
        self.dir_.load_chp_csv(chp_csv_lines)
Example #8
0
class TestDirectory(object):

    def setup(self):

        chp_csv_lines = '''郵遞區號,縣市名稱,鄉鎮市區,原始路名,投遞範圍
10058,臺北市,中正區,八德路1段,全
10079,臺北市,中正區,三元街,單全
10070,臺北市,中正區,三元街,雙  48號以下
10079,臺北市,中正區,三元街,雙  50號以上
10068,臺北市,中正區,大埔街,單  15號以上
10068,臺北市,中正區,大埔街,雙  36號以上
10051,臺北市,中正區,中山北路1段,單   3號以下
10041,臺北市,中正區,中山北路1段,雙  48號以下
10051,臺北市,中正區,中山南路,單   5號以下
10041,臺北市,中正區,中山南路,雙  18號以下
10002,臺北市,中正區,中山南路,    7號
10051,臺北市,中正區,中山南路,    9號
10048,臺北市,中正區,中山南路,單  11號以上
10001,臺北市,中正區,中山南路,   20號
10043,臺北市,中正區,中華路1段,單  25之   3號以下
10042,臺北市,中正區,中華路1段,單  27號至  47號
10010,臺北市,中正區,中華路1段,   49號
10042,臺北市,中正區,中華路1段,單  51號以上
10065,臺北市,中正區,中華路2段,單  79號以下
10066,臺北市,中正區,中華路2段,單  81號至 101號
10068,臺北市,中正區,中華路2段,單 103號至 193號
10069,臺北市,中正區,中華路2段,單 195號至 315號
10067,臺北市,中正區,中華路2段,單 317號至 417號
10072,臺北市,中正區,中華路2段,單 419號以上
10055,臺北市,中正區,丹陽街,全
10051,臺北市,中正區,仁愛路1段,    1號
10052,臺北市,中正區,仁愛路1段,連   2之   4號以上
10055,臺北市,中正區,仁愛路2段,單  37號以下
10060,臺北市,中正區,仁愛路2段,雙  48號以下
10056,臺北市,中正區,仁愛路2段,單  39號至  49號
10056,臺北市,中正區,仁愛路2段,雙  48之   1號至  64號
10062,臺北市,中正區,仁愛路2段,單  51號以上
10063,臺北市,中正區,仁愛路2段,雙  66號以上
20201,基隆市,中正區,義一路,    1號
20241,基隆市,中正區,義一路,連   2號以上
20250,基隆市,中正區,義二路,全
20241,基隆市,中正區,義三路,單全
20248,基隆市,中正區,漁港一街,全
20249,基隆市,中正區,漁港二街,全
20249,基隆市,中正區,漁港三街,全
20249,基隆市,中正區,調和街,全
20248,基隆市,中正區,環港街,全
20243,基隆市,中正區,豐稔街,全
20249,基隆市,中正區,觀海街,全
36046,苗栗縣,苗栗市,大埔街,全
81245,高雄市,小港區,豐田街,全
81245,高雄市,小港區,豐登街,全
81245,高雄市,小港區,豐善街,全
81245,高雄市,小港區,豐街,全
81245,高雄市,小港區,豐點街,全
81257,高雄市,小港區,寶山街,全
81362,高雄市,左營區,大中一路,單 331號以上
81362,高雄市,左營區,大中一路,雙 386號以上
81362,高雄市,左營區,大中二路,單 241號以下
81368,高雄市,左營區,大中二路,雙 200號以下
81369,高雄市,左營區,大中二路,雙 202號至 698號
81369,高雄市,左營區,大中二路,單 243號至 479號
81365,高雄市,左營區,大中二路,單 481號以上
81354,高雄市,左營區,大中二路,雙 700號以上
81357,高雄市,左營區,大順一路,單  91號至  95號
81357,高雄市,左營區,大順一路,雙  96號至 568號
81357,高雄市,左營區,大順一路,單 201號至 389巷'''.split('\n')

        self.dir_ = Directory(':memory:', keep_alive=True)
        self.dir_.load_chp_csv(chp_csv_lines)

    def test_find(self):

        # It retuns a partial zipcode when the address doesn't match any rule in
        # our directory.

        # 10043,臺北市,中正區,中華路1段,單  25之   3號以下
        assert self.dir_.find('臺北市中正區中華路1段25號') == '10043'
        assert self.dir_.find('臺北市中正區中華路1段25-2號') == '10043'
        assert self.dir_.find('臺北市中正區中華路1段25-3號') == '10043'
        assert self.dir_.find('臺北市中正區中華路1段25-4號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段26號') == '100'

        # 10042,臺北市,中正區,中華路1段,單  27號至  47號
        assert self.dir_.find('臺北市中正區中華路1段25號') == '10043'
        assert self.dir_.find('臺北市中正區中華路1段26號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段27號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段28號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段29號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段45號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段46號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段47號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段48號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段49號') == '10010'

        # 10010,臺北市,中正區,中華路1段,   49號
        assert self.dir_.find('臺北市中正區中華路1段48號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段49號') == '10010'
        assert self.dir_.find('臺北市中正區中華路1段50號') == '100'

        # 10042,臺北市,中正區,中華路1段,單  51號以上
        assert self.dir_.find('臺北市中正區中華路1段49號') == '10010'
        assert self.dir_.find('臺北市中正區中華路1段50號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段51號') == '10042'
        assert self.dir_.find('臺北市中正區中華路1段52號') == '100'
        assert self.dir_.find('臺北市中正區中華路1段53號') == '10042'

    def test_find_gradually(self):

        assert self.dir_.find('臺北市') == '100'
        assert self.dir_.find('臺北市中正區') == '100'
        assert self.dir_.find('臺北市中正區仁愛路1段') == '1005'
        assert self.dir_.find('臺北市中正區仁愛路1段1號') == '10051'

    def test_find_middle_token(self):

        assert self.dir_.find('左營區') == '813'
        assert self.dir_.find('大中一路') == '81362'
        assert self.dir_.find('大中二路') == '813'
        assert self.dir_.find('左營區大中一路') == '81362'
        assert self.dir_.find('左營區大中二路') == '813'

        assert self.dir_.find('小港區') == '812'
        assert self.dir_.find('豐街') == '81245'
        assert self.dir_.find('小港區豐街') == '81245'

        assert self.dir_.find('中正區') == ''

        assert self.dir_.find('大埔街') == ''
        assert self.dir_.find('台北市大埔街') == '10068'
        assert self.dir_.find('苗栗縣大埔街') == '36046'
Example #9
0
class TestDirectory(object):
    def setup(self):

        chp_csv_lines = """郵遞區號,縣市名稱,鄉鎮市區,原始路名,投遞範圍
10058,臺北市,中正區,八德路1段,全
10079,臺北市,中正區,三元街,單全
10070,臺北市,中正區,三元街,雙  48號以下
10079,臺北市,中正區,三元街,雙  50號以上
10068,臺北市,中正區,大埔街,單  15號以上
10068,臺北市,中正區,大埔街,雙  36號以上
10051,臺北市,中正區,中山北路1段,單   3號以下
10041,臺北市,中正區,中山北路1段,雙  48號以下
10051,臺北市,中正區,中山南路,單   5號以下
10041,臺北市,中正區,中山南路,雙  18號以下
10002,臺北市,中正區,中山南路,    7號
10051,臺北市,中正區,中山南路,    9號
10048,臺北市,中正區,中山南路,單  11號以上
10001,臺北市,中正區,中山南路,   20號
10043,臺北市,中正區,中華路1段,單  25之   3號以下
10042,臺北市,中正區,中華路1段,單  27號至  47號
10010,臺北市,中正區,中華路1段,   49號
10042,臺北市,中正區,中華路1段,單  51號以上
10065,臺北市,中正區,中華路2段,單  79號以下
10066,臺北市,中正區,中華路2段,單  81號至 101號
10068,臺北市,中正區,中華路2段,單 103號至 193號
10069,臺北市,中正區,中華路2段,單 195號至 315號
10067,臺北市,中正區,中華路2段,單 317號至 417號
10072,臺北市,中正區,中華路2段,單 419號以上
10055,臺北市,中正區,丹陽街,全
10051,臺北市,中正區,仁愛路1段,    1號
10052,臺北市,中正區,仁愛路1段,連   2之   4號以上
10055,臺北市,中正區,仁愛路2段,單  37號以下
10060,臺北市,中正區,仁愛路2段,雙  48號以下
10056,臺北市,中正區,仁愛路2段,單  39號至  49號
10056,臺北市,中正區,仁愛路2段,雙  48之   1號至  64號
10062,臺北市,中正區,仁愛路2段,單  51號以上
10063,臺北市,中正區,仁愛路2段,雙  66號以上
20201,基隆市,中正區,義一路,    1號
20241,基隆市,中正區,義一路,連   2號以上
20250,基隆市,中正區,義二路,全
20241,基隆市,中正區,義三路,單全
20248,基隆市,中正區,漁港一街,全
20249,基隆市,中正區,漁港二街,全
20249,基隆市,中正區,漁港三街,全
20249,基隆市,中正區,調和街,全
20248,基隆市,中正區,環港街,全
20243,基隆市,中正區,豐稔街,全
20249,基隆市,中正區,觀海街,全
36046,苗栗縣,苗栗市,大埔街,全
81245,高雄市,小港區,豐田街,全
81245,高雄市,小港區,豐登街,全
81245,高雄市,小港區,豐善街,全
81245,高雄市,小港區,豐街,全
81245,高雄市,小港區,豐點街,全
81257,高雄市,小港區,寶山街,全
81362,高雄市,左營區,大中一路,單 331號以上
81362,高雄市,左營區,大中一路,雙 386號以上
81362,高雄市,左營區,大中二路,單 241號以下
81368,高雄市,左營區,大中二路,雙 200號以下
81369,高雄市,左營區,大中二路,雙 202號至 698號
81369,高雄市,左營區,大中二路,單 243號至 479號
81365,高雄市,左營區,大中二路,單 481號以上
81354,高雄市,左營區,大中二路,雙 700號以上
81357,高雄市,左營區,大順一路,單  91號至  95號
81357,高雄市,左營區,大順一路,雙  96號至 568號
81357,高雄市,左營區,大順一路,單 201號至 389巷""".split(
            "\n"
        )

        self.dir_ = Directory(":memory:", keep_alive=True)
        self.dir_.load_chp_csv(chp_csv_lines)

    def test_find(self):

        # It retuns a partial zipcode when the address doesn't match any rule in
        # our directory.

        # 10043,臺北市,中正區,中華路1段,單  25之   3號以下
        assert self.dir_.find("臺北市中正區中華路1段25號") == "10043"
        assert self.dir_.find("臺北市中正區中華路1段25-2號") == "10043"
        assert self.dir_.find("臺北市中正區中華路1段25-3號") == "10043"
        assert self.dir_.find("臺北市中正區中華路1段25-4號") == "100"
        assert self.dir_.find("臺北市中正區中華路1段26號") == "100"

        # 10042,臺北市,中正區,中華路1段,單  27號至  47號
        assert self.dir_.find("臺北市中正區中華路1段25號") == "10043"
        assert self.dir_.find("臺北市中正區中華路1段26號") == "100"
        assert self.dir_.find("臺北市中正區中華路1段27號") == "10042"
        assert self.dir_.find("臺北市中正區中華路1段28號") == "100"
        assert self.dir_.find("臺北市中正區中華路1段29號") == "10042"
        assert self.dir_.find("臺北市中正區中華路1段45號") == "10042"
        assert self.dir_.find("臺北市中正區中華路1段46號") == "100"
        assert self.dir_.find("臺北市中正區中華路1段47號") == "10042"
        assert self.dir_.find("臺北市中正區中華路1段48號") == "100"
        assert self.dir_.find("臺北市中正區中華路1段49號") == "10010"

        # 10010,臺北市,中正區,中華路1段,   49號
        assert self.dir_.find("臺北市中正區中華路1段48號") == "100"
        assert self.dir_.find("臺北市中正區中華路1段49號") == "10010"
        assert self.dir_.find("臺北市中正區中華路1段50號") == "100"

        # 10042,臺北市,中正區,中華路1段,單  51號以上
        assert self.dir_.find("臺北市中正區中華路1段49號") == "10010"
        assert self.dir_.find("臺北市中正區中華路1段50號") == "100"
        assert self.dir_.find("臺北市中正區中華路1段51號") == "10042"
        assert self.dir_.find("臺北市中正區中華路1段52號") == "100"
        assert self.dir_.find("臺北市中正區中華路1段53號") == "10042"

    def test_find_gradually(self):

        assert self.dir_.find("臺北市") == "100"
        assert self.dir_.find("臺北市中正區") == "100"
        assert self.dir_.find("臺北市中正區仁愛路1段") == "1005"
        assert self.dir_.find("臺北市中正區仁愛路1段1號") == "10051"

    def test_find_middle_token(self):

        assert self.dir_.find("左營區") == "813"
        assert self.dir_.find("大中一路") == "81362"
        assert self.dir_.find("大中二路") == "813"
        assert self.dir_.find("左營區大中一路") == "81362"
        assert self.dir_.find("左營區大中二路") == "813"

        assert self.dir_.find("小港區") == "812"
        assert self.dir_.find("豐街") == "81245"
        assert self.dir_.find("小港區豐街") == "81245"

        assert self.dir_.find("中正區") == ""

        assert self.dir_.find("大埔街") == ""
        assert self.dir_.find("台北市大埔街") == "10068"
        assert self.dir_.find("苗栗縣大埔街") == "36046"