import pytest

from pypinyin import pinyin, load_phrases_dict
from pypinyin.seg import mmseg

seg_test = mmseg.Seg(mmseg.PrefixSet())
# yapf: disable
seg_test._prefix_set.train([
    'a',
    'ab',
    'abc',
    'abcd',
    'abd',
    'ac',
    'acd',
    'aff',
    'agf',
    'agfgef',
    'asdf',
    'bbs'
    '中国',
    '中国人',
    '中国人民',
    '中国人民银行',
    '我',
    '北京',
    '天安门',
    '员工',
])
# yapf: enable


# yapf: disable
@pytest.mark.parametrize(
    'input, expect', [
        ['', []],
        ['a', ['a']],
        ['abc', ['abc']],
        ['abcefg', ['abc', 'e', 'f', 'g']],
        ['bbcabce', ['bb', 'c', 'abc', 'e']],
        ['北京', ['北京']],
        ['北京,', ['北京', ',']],
        ['北京abc', ['北京', 'abc']],
        ['中国人民银行行长', ['中国人民银行', '行', '长']],
        ['中国人民银行员工', ['中国人民银行', '员工']],
        [
            'abcadbasfgafgasdabcagfaff我是中国人中国人民我爱北京天安门',
            [
                'abc',
                'a',
                'd',
                'b',
                'as',
                'f',
                'g',
                'af',
                'g',
                'asd',
                'abc',
                'agf',
                'aff',
                '我',
                '是',
                '中国人',
                '中国人民',
                '我',
                '爱',
                '北京',
                '天安门',
            ],
        ],
    ]
)
# yapf: enable
def test_mmseg(input, expect):
    assert list(seg_test.cut(input)) == expect


@pytest.mark.parametrize('input, default_ret, mmseg_ret', [
    [
        '一语中的啊',
        [['yī'], ['yǔ'], ['zhōng'], ['de'], ['a']],
        [['yī'], ['yǔ'], ['zhòng'], ['dì'], ['a']],
    ],
])
def test_mmseg_for_pinyin(input, default_ret, mmseg_ret):
    assert pinyin(input) == mmseg_ret
    assert pinyin(mmseg.seg.cut(input)) == mmseg_ret


@pytest.mark.parametrize('input, jieba_ret, mmseg_ret', [
    [
        '了局啊',
        [['le'], ['jú'], ['a']],
        [['liǎo'], ['jú'], ['a']],
    ],
])
def test_mmseg_and_jieba_for_pinyin(input, jieba_ret, mmseg_ret):
    assert pinyin(input) == mmseg_ret
    assert pinyin(mmseg.seg.cut(input)) == mmseg_ret


def test_retrain():
    seg = mmseg.seg
    assert list(seg.cut('啊啊啊')) == ['啊', '啊', '啊']

    load_phrases_dict({'啊啊啊': [['a'], ['a'], ['a']]})
    mmseg.retrain(seg)
    assert list(seg.cut('啊啊啊')) == ['啊啊啊']

    assert list(seg.cut('男孩儿')) == ['男孩儿']


def test_phrases():
    seg = mmseg.seg
    assert list(seg.cut('你要重新考虑这条建议')) == \
           ['你', '要', '重新', '考', '虑', '这', '条', '建', '议']
    load_phrases_dict({'在一起': [['zài'], ['yì'], ['qǐ']]})
    assert list(seg.cut('在一片')) == ['在', '一片']

    # 前缀匹配,后缀是词语
    #
    # 输入头部是另外一个词语的头部,会匹配其他词语的前缀
    # 输入尾部是一个词语
    # 此时这个尾部词语要被分词出来
    assert list(seg.cut('行业')) == ['行业']
    assert list(seg.cut('金融行业')) == ['金', '融', '行业']
    # 整个是词语
    assert list(seg.cut('金融寡头')) == ['金融寡头']
    assert list(seg.cut('服务行业')) == ['服务行业']
    assert list(seg.cut('人员')) == ['人员']
    assert list(seg.cut('服务人员')) == ['服务', '人员']

    assert list(seg.cut('银行')) == ['银行']
    assert list(seg.cut('浦发银行')) == ['浦', '发', '银行']

    assert list(seg.cut('')) == []
    # 整个匹配前缀,但是不是词语
    assert list(seg.cut('金')) == ['金']
    assert list(seg.cut('金融')) == ['金', '融']
    #
    assert list(seg.cut('金融金')) == ['金', '融', '金']
    assert list(seg.cut('金融金融')) == ['金', '融', '金', '融']
    assert list(seg.cut('金融金融金融金融金融金融')) == [
        '金', '融', '金', '融', '金', '融', '金', '融', '金', '融', '金', '融'
    ]
    assert list(seg.cut('金融金融金融金融金融金融金')) == [
        '金', '融', '金', '融', '金', '融', '金', '融', '金', '融', '金', '融', '金'
    ]

    # 没有任何匹配
    assert list(
        seg.cut('以其昏昏,使人昭昭')) == ['以', '其', '昏', '昏', ',', '使', '人', '昭', '昭']

    # 前缀无任何匹配, 后缀是词语
    assert list(seg.cut('以其昏昏行业')) == ['以', '其', '昏', '昏', '行业']

    # 前缀是词语
    assert list(seg.cut('行业以其昏昏')) == ['行业', '以', '其', '昏', '昏']

    # 中间是词语
    assert list(seg.cut('使人昭昭行业以其昏昏')) == [
        '使', '人', '昭', '昭', '行业', '以', '其', '昏', '昏'
    ]


# yapf: disable
def test_seg_long():
    seg = mmseg.seg
    assert list(seg.cut('''    真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。
    这是怎样的哀痛者和幸福者?然而造化又常常为庸人设计,以时间的流驶,来洗涤旧迹,
    仅使留下淡红的血色和微漠的悲哀。在这淡红的血色和微漠的悲哀中,又给人暂得偷生,
    维持着这似人非人的世界。我不知道这样的世界何时是一个尽头!
  我们还在这样的世上活着;我也早觉得有写一点东西的必要了。离三月十八日也已有两星期,
    忘却的救主快要降临了罢,我正有写一点东西的必要了。''')) == [
        ' ',
        ' ',
        ' ',
        ' ',
        '真',
        '的',
        '猛',
        '士',
        ',',
        '敢',
        '于',
        '直',
        '面',
        '惨',
        '淡',
        '的',
        '人',
        '生',
        ',',
        '敢',
        '于',
        '正视',
        '淋',
        '漓',
        '的',
        '鲜血',
        '。',
        '\n',
        ' ',
        ' ',
        ' ',
        ' ',
        '这',
        '是',
        '怎',
        '样',
        '的',
        '哀',
        '痛',
        '者',
        '和',
        '幸',
        '福',
        '者',
        '?',
        '然',
        '而',
        '造化',
        '又',
        '常',
        '常',
        '为',
        '庸',
        '人',
        '设',
        '计',
        ',',
        '以',
        '时间',
        '的',
        '流',
        '驶',
        ',',
        '来',
        '洗涤',
        '旧',
        '迹',
        ',',
        '\n',
        ' ',
        ' ',
        ' ',
        ' ',
        '仅',
        '使',
        '留',
        '下',
        '淡',
        '红',
        '的',
        '血色',
        '和',
        '微',
        '漠',
        '的',
        '悲',
        '哀',
        '。',
        '在',
        '这',
        '淡',
        '红',
        '的',
        '血色',
        '和',
        '微',
        '漠',
        '的',
        '悲',
        '哀',
        '中',
        ',',
        '又',
        '给',
        '人',
        '暂',
        '得',
        '偷',
        '生',
        ',',
        '\n',
        ' ',
        ' ',
        ' ',
        ' ',
        '维',
        '持',
        '着',
        '这',
        '似',
        '人',
        '非',
        '人',
        '的',
        '世',
        '界',
        '。',
        '我',
        '不',
        '知道',
        '这样',
        '的',
        '世',
        '界',
        '何时',
        '是',
        '一个',
        '尽头',
        '!',
        '\n',
        '\u3000',
        '\u3000',
        '我们',
        '还',
        '在',
        '这样',
        '的',
        '世上',
        '活着',
        ';',
        '我',
        '也',
        '早',
        '觉得',
        '有',
        '写',
        '一点',
        '东',
        '西',
        '的',
        '必要',
        '了',
        '。',
        '离',
        '三',
        '月',
        '十',
        '八',
        '日',
        '也',
        '已',
        '有',
        '两',
        '星期',
        ',',
        '\n',
        ' ',
        ' ',
        ' ',
        ' ',
        '忘',
        '却',
        '的',
        '救',
        '主',
        '快要',
        '降临',
        '了',
        '罢',
        ',',
        '我',
        '正',
        '有',
        '写',
        '一点',
        '东',
        '西',
        '的',
        '必要',
        '了',
        '。']

    assert list(seg.cut(
        '人们常常把人与自然对立起来,宣称要征服自然。殊不知在大自然面前,'
        '人类永远只是一个天真幼稚的孩童,而他却要作自然的主人!'
        '他只是大自然机体上普通的一部分,正像一株小草只是她的普通一部分一样,'
        '有什么资格与自然对立! 如果说自然的智慧是大海,那么,'
        '人类的智慧就只是大海中的一个小水滴,虽然这个水滴也映照着大海,'
        '但毕竟不是大海。可是,人们竟然不自量力 地宣称要用滴水来代替大海。')) == [
               '人们',
               '常',
               '常',
               '把',
               '人',
               '与',
               '自',
               '然',
               '对',
               '立',
               '起',
               '来',
               ',',
               '宣称',
               '要',
               '征服',
               '自',
               '然',
               '。',
               '殊不知',
               '在',
               '大自然',
               '面',
               '前',
               ',',
               '人',
               '类',
               '永',
               '远',
               '只是',
               '一个',
               '天',
               '真',
               '幼',
               '稚',
               '的',
               '孩',
               '童',
               ',',
               '而',
               '他',
               '却',
               '要',
               '作',
               '自',
               '然',
               '的',
               '主',
               '人',
               '!',
               '他',
               '只是',
               '大自然',
               '机体',
               '上',
               '普',
               '通',
               '的',
               '一',
               '部分',
               ',',
               '正像',
               '一',
               '株',
               '小',
               '草',
               '只是',
               '她',
               '的',
               '普',
               '通',
               '一',
               '部分',
               '一',
               '样',
               ',',
               '有',
               '什么',
               '资',
               '格',
               '与',
               '自',
               '然',
               '对',
               '立',
               '!',
               ' ',
               '如',
               '果',
               '说',
               '自',
               '然',
               '的',
               '智',
               '慧',
               '是',
               '大海',
               ',',
               '那么',
               ',',
               '人',
               '类',
               '的',
               '智',
               '慧',
               '就',
               '只是',
               '大海',
               '中的',
               '一个',
               '小',
               '水',
               '滴',
               ',',
               '虽',
               '然',
               '这个',
               '水',
               '滴',
               '也',
               '映',
               '照',
               '着',
               '大海',
               ',',
               '但',
               '毕',
               '竟',
               '不是',
               '大海',
               '。',
               '可是',
               ',',
               '人们',
               '竟',
               '然',
               '不自量力',
               ' ',
               '地',
               '宣称',
               '要',
               '用',
               '滴',
               '水',
               '来',
               '代',
               '替',
               '大海',
               '。']

    assert list(seg.cut(
        '该负责人表示,银行保险机构具有外部性强、财务杠杆率高、'
        '信息不对称严重等特征,不同于一般工商企业,对其股东股权必须从严管理。'
        '总体上,银保监会将坚持“两个不变”。一是坚持鼓励社会资本参与银行保险机构改革、'
        '优化股东结构的积极取向不变。银保监会将继续畅通社会资本投资入股银行保险机构的渠道,'
        '优化股东结构、充实机构资本,重点引入注重机构长远发展、资本实力雄厚、管理经验'
        '丰富的战略性股东。二是坚持严惩股东违法违规行为、规范公司治理的高压态势不变。'
        '银保监会将继续深入排查整治违法违规股东股权,依法清理规范股权关系,'
        '对股东严重违法违规行为,将坚决予以惩戒,发现一起、查处一起。')) == [
               '该',
               '负',
               '责',
               '人',
               '表',
               '示',
               ',',
               '银行',
               '保',
               '险',
               '机',
               '构',
               '具有',
               '外',
               '部',
               '性',
               '强',
               '、',
               '财',
               '务',
               '杠杆',
               '率',
               '高',
               '、',
               '信息',
               '不对',
               '称',
               '严重',
               '等',
               '特',
               '征',
               ',',
               '不同',
               '于',
               '一般',
               '工',
               '商',
               '企',
               '业',
               ',',
               '对',
               '其',
               '股',
               '东',
               '股',
               '权',
               '必',
               '须',
               '从',
               '严',
               '管',
               '理',
               '。',
               '总体',
               '上',
               ',',
               '银',
               '保',
               '监',
               '会',
               '将',
               '坚',
               '持',
               '“',
               '两个',
               '不变',
               '”',
               '。',
               '一',
               '是',
               '坚',
               '持',
               '鼓',
               '励',
               '社会',
               '资',
               '本',
               '参与',
               '银行',
               '保',
               '险',
               '机',
               '构',
               '改',
               '革',
               '、',
               '优化',
               '股',
               '东',
               '结构',
               '的',
               '积',
               '极',
               '取',
               '向',
               '不变',
               '。',
               '银',
               '保',
               '监',
               '会',
               '将',
               '继',
               '续',
               '畅',
               '通',
               '社会',
               '资',
               '本',
               '投',
               '资',
               '入',
               '股',
               '银行',
               '保',
               '险',
               '机',
               '构',
               '的',
               '渠道',
               ',',
               '优化',
               '股',
               '东',
               '结构',
               '、',
               '充',
               '实',
               '机',
               '构',
               '资',
               '本',
               ',',
               '重点',
               '引',
               '入',
               '注重',
               '机',
               '构',
               '长远',
               '发展',
               '、',
               '资',
               '本',
               '实',
               '力',
               '雄',
               '厚',
               '、',
               '管',
               '理',
               '经',
               '验',
               '丰',
               '富',
               '的',
               '战',
               '略',
               '性',
               '股',
               '东',
               '。',
               '二',
               '是',
               '坚',
               '持',
               '严',
               '惩',
               '股',
               '东',
               '违',
               '法',
               '违',
               '规',
               '行为',
               '、',
               '规',
               '范',
               '公',
               '司',
               '治',
               '理',
               '的',
               '高压',
               '态',
               '势',
               '不变',
               '。',
               '银',
               '保',
               '监',
               '会',
               '将',
               '继',
               '续',
               '深',
               '入',
               '排',
               '查',
               '整',
               '治',
               '违',
               '法',
               '违',
               '规',
               '股',
               '东',
               '股',
               '权',
               ',',
               '依',
               '法',
               '清',
               '理',
               '规',
               '范',
               '股',
               '权',
               '关系',
               ',',
               '对',
               '股',
               '东',
               '严重',
               '违',
               '法',
               '违',
               '规',
               '行为',
               ',',
               '将',
               '坚',
               '决',
               '予以',
               '惩',
               '戒',
               ',',
               '发现',
               '一起',
               '、',
               '查处',
               '一起',
               '。']
# yapf: enable

if __name__ == '__main__':
    import pytest

    pytest.cmdline.main()