def test_eng_cjk_feat(self):
     entry = as_node(""""Winter Flower (雪中梅) (feat. [[RM]])" - 3:41""", root=self.root)
     name = parse_kf_track_name(entry)
     self.assertNamesEqual(
         name,
         Name('Winter Flower', '雪中梅', extra={'length': '3:41', 'feat': as_node("""[[RM]]""", root=self.root)})
     )
 def test_unzipped_collabs(self):
     entry = as_node("""[[7989]] ([[Kangta]] & [[Taeyeon]] (강타&태연))""", root=self.root)
     name = parse_generasia_track_name(entry)
     expected = Name(
         '7989', extra={'artists': as_node("""( [[Kangta]] & [[Taeyeon]] (강타&태연))""", root=self.root)}
     )
     self.assertNamesEqual(name, expected)
 def test_track_30(self):
     entry = as_node(""""[[Can't Love You Anymore]] (사랑이 잘)" (with [[w:c:kindie:Oh Hyuk|Oh Hyuk]])""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = 'Can\'t Love You Anymore', '사랑이 잘'
     self.assertAll(
         name, eng, eng, han, han, extra={'collabs': as_node("""[[w:c:kindie:Oh Hyuk|Oh Hyuk]]""", root=self.root)}
     )
 def test_rom_eng_feat_han_lit(self):
     entry = as_node("""[[Hwaseongin Baireoseu (Boys & Girls)]] (feat. [[Key]] ([[SHINee]])) (화성인 바이러스; ''Martian Virus'')""")
     name = parse_generasia_track_name(entry)
     rom, eng, ko, lit = 'Hwaseongin Baireoseu', 'Boys & Girls', '화성인 바이러스', 'Martian Virus'
     feat = as_node("""[[Key]] ( [[SHINee]] )""")
     log.debug(f'Expected feat={feat.raw.string!r}')
     self.assertAll(name, eng, eng, ko, ko, romanized=rom, lit_translation=lit, extra={'feat': feat})
 def test_track_28(self):
     entry = as_node(""""You Know (있잖 아)" (Feat. [[Mario]]) - 3:21""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = 'You Know', '있잖 아'
     self.assertAll(
         name, eng, eng, han, han, extra={'length': '3:21', 'feat': as_node("""[[Mario]]""", root=self.root)}
     )
 def test_feat_link_inside_quotes(self):
     entry = as_node(""""Starry Night (feat. [[Crush (singer)|Crush]])" - 3:31""", root=self.root)
     name = parse_kf_track_name(entry)
     self.assertNamesEqual(
         name, Name('Starry Night', extra={
             'length': '3:31', 'feat': as_node("""[[Crush (singer)|Crush]]""", root=self.root)
         })
     )
 def test_track_27(self):
     entry = as_node(""""Always Winter (언제나 겨울)" <small>([[Skull (singer)|Skull]])</small> - 3:11""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = 'Always Winter', '언제나 겨울'
     self.assertAll(
         name, eng, eng, han, han,
         extra={'length': '3:11', 'artists': as_node("""[[Skull (singer)|Skull]]""", root=self.root)}
     )
 def test_track_artist_solo_repr(self):
     entry = as_node(""""Be Calm (덤덤해지네)" ([[Hwa Sa]] solo) - 3:28""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = 'Be Calm', '덤덤해지네'
     self.assertAll(
         name, eng, eng, han, han, extra={'artists': as_node("""[[Hwa Sa]]""", root=self.root), 'length': '3:28'}
     )
     track = Track(4, name, None)
     self.assertEqual(track.full_name(collabs=True), 'Be Calm (덤덤해지네) (Hwa Sa (화사) solo)')
 def test_track_29(self):
     entry = as_node(""""Voice Mail (Korean ver.)" (Bonus track) - 4:06""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = 'Voice Mail', None
     self.assertAll(
         name, eng, eng, han, han, extra={'length': '4:06', 'version': 'Korean ver.', 'misc': 'Bonus track'}
     )
 def test_ost_multiple_songs(self):
     entry = as_node("""[2007.11.23] [[Thirty Thousand Miles in Search of My Son OST]] ''(#1 Touch the Sky (Original Ver.), #13 Touch the Sky (Drama Ver.))''""")
     name = parse_generasia_album_name(entry)
     en = 'Thirty Thousand Miles in Search of My Son OST'
     self.assertAll(
         name, en, en, extra={'tracks': ('#1 Touch the Sky (Original Ver.)', '#13 Touch the Sky (Drama Ver.)')}
     )
 def test_rom_eng_han_lit(self):
     entry = as_node("""[2009.06.29] [[Sowoneul Malhaebwa (Genie)]] (소원을 말해봐; ''Tell Me Your Wish'')""")
     name = parse_generasia_album_name(entry)
     self.assertAll(
         name, 'Genie', 'Genie', '소원을 말해봐', '소원을 말해봐', romanized='Sowoneul Malhaebwa',
         lit_translation='Tell Me Your Wish'
     )
 def test_rom_han_lit(self):
     entry = as_node("""[2007.11.01] [[So Nyeo Si Dae]] (소녀시대; ''Girls' Generation'')""")
     name = parse_generasia_album_name(entry)
     self.assertAll(
         name, 'Girls\' Generation', None, '소녀시대', '소녀시대', romanized='So Nyeo Si Dae',
         lit_translation='Girls\' Generation'
     )
 def test_multi_meta_in_quotes(self):
     entry = as_node(""""Just One Day (Japanese ver.) (Extended play)" - 5:33""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = 'Just One Day', None
     self.assertAll(
         name, eng, eng, han, han, extra={'length': '5:33', 'version': 'Japanese ver.', 'misc': 'Extended play'}
     )
 def test_cjk_eng_rom_ver(self):
     entry = as_node("""[[Wolf (EXO)|Lang Yu Meinu (Wolf) (EXO-M Ver.)]] (狼与美女)""")
     name = parse_generasia_track_name(entry)
     self.assertAll(
         name, 'Wolf', 'Wolf', '狼与美女', cjk='狼与美女', romanized='Lang Yu Meinu',
         extra={'version': 'EXO-M Ver.'}
     )
 def test_ost_rom_track_missing_num(self):
     # Would prefer that this be captured as a romanization, but that would be tough
     # This is really better suited to be tested as a full line parse test, rather than just the name
     entry = as_node("""[2014.11.06] [[Naegen Neomu Sarangseureoun Geunyeo OST]] (# ''I Norae'')""")
     name = parse_generasia_album_name(entry)
     en = 'Naegen Neomu Sarangseureoun Geunyeo OST'
     self.assertAll(name, en, en, extra={'track': '# I Norae'})
 def test_cjk_eng_rom_lit(self):
     entry = as_node("""[[Wolf (EXO)|Lang Yu Meinu (Wolf)]] (狼与美女; ''Wolf and the Beauty'')""")
     name = parse_generasia_track_name(entry)
     self.assertAll(
         name, 'Wolf', 'Wolf', '狼与美女', cjk='狼与美女', romanized='Lang Yu Meinu',
         lit_translation='Wolf and the Beauty'
     )
 def test_multi_non_eng(self):
     intro = as_node(
         """'''BTS''' (Korean: 방탄소년단; Japanese: 防弾少年团; also known as '''Bangtan Boys''' and '''Beyond the Scene''') is a seven-member boy group under [[Big Hit Entertainment]]. They debuted on June 13, 2013 with their first single ''[[2 Cool 4 Skool]]''."""
     )
     names = name_from_intro(fake_page(intro))
     self.assertNamesEqual(
         names,
         {Name('BTS', '방탄소년단'), Name('BTS', '防弾少年团')})
 def test_multi_enclosed_with_lang(self):
     entry = as_node(""""Hanabi (Remember Me) (花火)" <small>(Japanese ver.)</small> - 3:14""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, non_eng, rom = 'Remember Me', '花火', 'Hanabi'
     self.assertAll(
         name, eng, eng, non_eng, cjk=non_eng, romanized=rom,
         extra={'length': '3:14', 'version': 'Japanese ver.'}
     )
 def test_partial_romanized(self):
     entry = as_node("""Dallyeo! (Relay) (달려!; ''Run!'')""")
     entry.root = MagicMock(title='Dallyeo! (Relay)')
     name = parse_generasia_album_name(entry)
     self.assertAll(
         name, 'Run! (Relay)', None, '달려! (Relay)', '달려! (Relay)', romanized='Dallyeo! (Relay)',
         lit_translation='Run! (Relay)'
     )
 def test_multi_and(self):
     intro = as_node(
         """'''Girls' Generation''' (소녀시대 (''So Nyeo Si Dae'' or ''SNSD'') in Korea, and 少女時代 (''Shoujo Jidai'') in Japan) is a [[K-Pop|Korean pop]] girl group formed by [[SM Entertainment]]. Prior to their debut, they were described as the female [[Super Junior]] by [[SM Entertainment]]. They became well known after their hit 2009 song "[[Gee (song)|Gee]]". """
     )
     names = name_from_intro(fake_page(intro))
     expected = {
         Name('Girls\' Generation',
              '소녀시대',
              romanized='So Nyeo Si Dae',
              versions={Name('SNSD', '소녀시대', romanized='So Nyeo Si Dae')}),
         Name('Girls\' Generation', '少女時代', romanized='Shoujo Jidai'),
     }
     self.assertNamesEqual(names, expected)
 def test_inst_eng(self):
     entry = as_node(""""Wow Thing (Inst.)" - 2:52""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = 'Wow Thing', None
     self.assertAll(name, eng, eng, han, han, extra={'length': '2:52', 'instrumental': True})
 def test_sung_by_list(self):
     entry = as_node(""""Hair in the Air" (Sung By [[Yeri (Red Velvet)|Yeri]], [[Renjun]], [[Jeno]], [[Jaemin]]) - 2:47""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = 'Hair in the Air', None
     artists = as_node("""[[Yeri (Red Velvet)|Yeri]] , [[Renjun]] , [[Jeno]] , [[Jaemin]]""", root=self.root)
     self.assertAll(name, eng, eng, han, han, extra={'length': '2:47', 'artists': artists})
 def test_numeric_title(self):
     entry = as_node(""""134340" - 3:49""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = '134340', None
     self.assertAll(name, eng, eng, han, han, extra={'length': '3:49'})
 def test_eng_han_rom_lit_track(self):
     entry = as_node("""[[Perfect for You (Sowon)|Honey (Sowon)]] (소원; ''Wish'')""", root=self.root)
     name = parse_generasia_track_name(entry)
     self.assertNamesEqual(name, Name('Honey', '소원', romanized='Sowon', lit_translation='Wish'))
 def test_feat_no_link(self):
     entry = as_node(""""BTS Cypher Pt.3: Killer" (feat. Supreme Boi) - 4:28""", root=self.root)
     name = parse_kf_track_name(entry)
     eng, han = 'BTS Cypher Pt.3: Killer', None
     self.assertAll(name, eng, eng, han, han, extra={'length': '4:28', 'feat': 'Supreme Boi'})
 def test_remix_feat(self):
     entry = as_node("""[[Bad Girl (Girls' Generation)|BAD GIRL (The Cataracs Remix)]] feat. [[DEV]]""", root=self.root)
     name = parse_generasia_track_name(entry)
     self.assertNamesEqual(
         name, Name('BAD GIRL', extra={'remix': 'The Cataracs Remix', 'feat': as_node("""[[DEV]]""", root=self.root)})
     )
 def test_rom_eng_cjk(self):
     entry = as_node("""[[Baby (EXO)|Di Yi Bu (Baby)]] (第一步)""")
     name = parse_generasia_track_name(entry)
     self.assertAll(name, 'Baby', 'Baby', '第一步', cjk='第一步', romanized='Di Yi Bu')
 def test_half_enclosed_version(self):
     entry = as_node("""[[Byeol Byeol Byeol|Byeol Byeol Byeol (☆★☆)- Acoustic RnB ver.]] (별별별; ''Star Star Star'')""")
     name = parse_generasia_track_name(entry)
     rom, eng, ko, lit = 'Byeol Byeol Byeol', '☆★☆', '별별별', 'Star Star Star'
     self.assertAll(name, eng, eng, ko, ko, romanized=rom, lit_translation=lit, extra={'version': 'Acoustic R&B ver.'})
 def test_more_rom_eng_han_lit(self):
     entry = as_node("""[[Geunyang Utja (Be Happy)]] (웃자; ''Just Smile'')""")
     name = parse_generasia_track_name(entry)
     rom, eng, ko, lit = 'Geunyang Utja', 'Be Happy', '웃자', 'Just Smile'
     self.assertAll(name, eng, eng, ko, ko, romanized=rom, lit_translation=lit)
 def test_rom_eng_han_lit(self):
     entry = as_node("""[[Yeongwonhi Neowa Ggumgugo Shipda (Forever)]] (영원히 너와 꿈꾸고 싶다; ''I Want To Dream Forever With You'')""")
     name = parse_generasia_track_name(entry)
     rom, ko = 'Yeongwonhi Neowa Ggumgugo Shipda', '영원히 너와 꿈꾸고 싶다'
     lit = 'I Want To Dream Forever With You'
     self.assertAll(name, 'Forever', 'Forever', ko, ko, romanized=rom, lit_translation=lit)