All tests passed. (refresh)

Text Expected Actual Differs at
test_convert_ipa_to_xsampa:
Passed /ukrɑˈjɪnɑ/ /ukrA"jInA/ /ukrA"jInA/
Passed /ˈdɪkʃənɛɹi/ /"dIkS@nEr\i/ /"dIkS@nEr\i/
Passed /krɛ(ː)m/ /krE(:)m/ /krE(:)m/
Passed [bˠɑːd̪ˠ] [b_GA:d_d_G] [b_GA:d_d_G]
Passed [ŋ̍˩˨] [N=__B__L] [N=__B__L]
Passed [bˠɑːdʲ] [b_GA:d_j] [b_GA:d_j]
Passed [næu̯ˈɾɵːz] [n{u_^"48:z] [n{u_^"48:z]
Passed [ɕɪn˥˥niɛn˧˥] [s\In__T__TniEn__M__T] [s\In__T__TniEn__M__T]
Passed /ˈdɪkʃən(ə)ɹi/ /"dIkS@n(@)r\i/ /"dIkS@n(@)r\i/
Passed [ˈmɝdɚ] ["m3`d@`] ["m3`d@`]
Passed [næu̯ˈɾoːz] [n{u_^"4o:z] [n{u_^"4o:z]
Passed [ˈbætl̩ʃɪp] ["b{tl=SIp] ["b{tl=SIp]
Passed [noːˈɾuːz] [no:"4u:z] [no:"4u:z]
Passed [nou̯ˈɾuːz] [nou_^"4u:z] [nou_^"4u:z]
Passed /t͡ʃeɪnd͡ʒ/ /t__SeInd__Z/ /t__SeInd__Z/
Passed /ˈdæzl̩/ /"d{zl=/ /"d{zl=/
Text Expected Actual Differs at
test_convert_xsampa_to_ipa:
Passed /ukrA"jInA/ /ukrɑˈjɪnɑ/ /ukrɑˈjɪnɑ/
Passed /"dIkS@nEr\i/ /ˈdɪkʃənɛɹi/ /ˈdɪkʃənɛɹi/
Passed /krE(:)m/ /krɛ(ː)m/ /krɛ(ː)m/
Passed [b_GA:d_d_G] [bˠɑːd̪ˠ] [bˠɑːd̪ˠ]
Passed [N=__B__L] [ŋ̍˩˨] [ŋ̍˩˨]
Passed [b_GA:d_j] [bˠɑːdʲ] [bˠɑːdʲ]
Passed [n{u_^"48:z] [næu̯ˈɾɵːz] [næu̯ˈɾɵːz]
Passed [s\In__T__TniEn__M__T] [ɕɪn˥˥niɛn˧˥] [ɕɪn˥˥niɛn˧˥]
Passed /"dIkS@n(@)r\i/ /ˈdɪkʃən(ə)ɹi/ /ˈdɪkʃən(ə)ɹi/
Passed ["m3`d@`] [ˈmɝdɚ] [ˈmɝdɚ]
Passed [n{u_^"4o:z] [næu̯ˈɾoːz] [næu̯ˈɾoːz]
Passed ["b{tl=SIp] [ˈbætl̩ʃɪp] [ˈbætl̩ʃɪp]
Passed [no:"4u:z] [noːˈɾuːz] [noːˈɾuːz]
Passed [nou_^"4u:z] [nou̯ˈɾuːz] [nou̯ˈɾuːz]
Passed /t__SeInd__Z/ /t͡ʃeɪnd͡ʒ/ /t͡ʃeɪnd͡ʒ/
Passed /"d{zl=/ /ˈdæzl̩/ /ˈdæzl̩/
Text Expected Actual Differs at
test_roundtrip_ipa:
Passed /ukrɑˈjɪnɑ/ /ukrɑˈjɪnɑ/ /ukrɑˈjɪnɑ/
Passed /ˈdɪkʃənɛɹi/ /ˈdɪkʃənɛɹi/ /ˈdɪkʃənɛɹi/
Passed /krɛ(ː)m/ /krɛ(ː)m/ /krɛ(ː)m/
Passed [bˠɑːd̪ˠ] [bˠɑːd̪ˠ] [bˠɑːd̪ˠ]
Passed [ŋ̍˩˨] [ŋ̍˩˨] [ŋ̍˩˨]
Passed [bˠɑːdʲ] [bˠɑːdʲ] [bˠɑːdʲ]
Passed [næu̯ˈɾɵːz] [næu̯ˈɾɵːz] [næu̯ˈɾɵːz]
Passed [ɕɪn˥˥niɛn˧˥] [ɕɪn˥˥niɛn˧˥] [ɕɪn˥˥niɛn˧˥]
Passed /ˈdɪkʃən(ə)ɹi/ /ˈdɪkʃən(ə)ɹi/ /ˈdɪkʃən(ə)ɹi/
Passed [ˈmɝdɚ] [ˈmɝdɚ] [ˈmɝdɚ]
Passed [næu̯ˈɾoːz] [næu̯ˈɾoːz] [næu̯ˈɾoːz]
Passed [ˈbætl̩ʃɪp] [ˈbætl̩ʃɪp] [ˈbætl̩ʃɪp]
Passed [noːˈɾuːz] [noːˈɾuːz] [noːˈɾuːz]
Passed [nou̯ˈɾuːz] [nou̯ˈɾuːz] [nou̯ˈɾuːz]
Passed /t͡ʃeɪnd͡ʒ/ /t͡ʃeɪnd͡ʒ/ /t͡ʃeɪnd͡ʒ/
Passed /ˈdæzl̩/ /ˈdæzl̩/ /ˈdæzl̩/
Text Expected Actual Differs at
test_roundtrip_xsampa:
Passed /ukrA"jInA/ /ukrA"jInA/ /ukrA"jInA/
Passed /"dIkS@nEr\i/ /"dIkS@nEr\i/ /"dIkS@nEr\i/
Passed /krE(:)m/ /krE(:)m/ /krE(:)m/
Passed [b_GA:d_d_G] [b_GA:d_d_G] [b_GA:d_d_G]
Passed [N=__B__L] [N=__B__L] [N=__B__L]
Passed [b_GA:d_j] [b_GA:d_j] [b_GA:d_j]
Passed [n{u_^"48:z] [n{u_^"48:z] [n{u_^"48:z]
Passed [s\In__T__TniEn__M__T] [s\In__T__TniEn__M__T] [s\In__T__TniEn__M__T]
Passed /"dIkS@n(@)r\i/ /"dIkS@n(@)r\i/ /"dIkS@n(@)r\i/
Passed ["m3`d@`] ["m3`d@`] ["m3`d@`]
Passed [n{u_^"4o:z] [n{u_^"4o:z] [n{u_^"4o:z]
Passed ["b{tl=SIp] ["b{tl=SIp] ["b{tl=SIp]
Passed [no:"4u:z] [no:"4u:z] [no:"4u:z]
Passed [nou_^"4u:z] [nou_^"4u:z] [nou_^"4u:z]
Passed /t__SeInd__Z/ /t__SeInd__Z/ /t__SeInd__Z/
Passed /"d{zl=/ /"d{zl=/ /"d{zl=/

local tests = require('Module:UnitTests')
local m_IPA = require('Module:IPA')

local testcases = {
--	[ XSAMPA					] = IPA					;

	-- en: [[dictionary]]
	['/"dIkS@n(@)r\\i/'			] = '/ˈdɪkʃən(ə)ɹi/'	;
	['/"dIkS@nEr\\i/'			] = '/ˈdɪkʃənɛɹi/'		;
	
	-- en: [[battleship]]
	['["b{tl=SIp]'				] = '[ˈbætl̩ʃɪp]'		;

	-- en: [[murder]]
	['["m3`d@`]'				] = '[ˈmɝdɚ]'			;

	-- en: [[dazzle]]
	['/"d{zl=/'					] = '/ˈdæzl̩/'			;

--[=[	 en: [[change]]
	 ['/ʧeɪnʤ/'			 		] = '/t͡ʃeInd͡ʒ/'			;	]=]

	-- en: [[change]]
	['/t__SeInd__Z/'			] = '/t͡ʃeɪnd͡ʒ/'			;
	
	-- uk: [[Україна]]
	['/ukrA"jInA/'				] = '/ukrɑˈjɪnɑ/'		;
	
	-- fa: [[نوروز]]
	['[n{u_^"4o:z]'				] = '[næu̯ˈɾoːz]'		;
	['[nou_^"4u:z]'				] = '[nou̯ˈɾuːz]'		;
	['[no:"4u:z]'				] = '[noːˈɾuːz]'		;
	['[n{u_^"48:z]'				] = '[næu̯ˈɾɵːz]'		;

	-- cmn: [[新年]]
	['[s\\In__T__TniEn__M__T]'	] = '[ɕɪn˥˥niɛn˧˥]' 		;
	
	-- yue: [[唔]]
	['[N=__B__L]'					] = '[ŋ̍˩˨]'					;
	
	-- ga: [[báid]],  [[bád]]
	['[b_GA:d_j]'				] = '[bˠɑːdʲ]'			;
	['[b_GA:d_d_G]'				] = '[bˠɑːd̪ˠ]'			;

	-- nl: [[crème]]
	['/krE(:)m/'				] = '/krɛ(ː)m/'			;

}

local function format_ipa(ipa)
	return '<span class="IPA" lang="">' .. ipa .. '</span>'
end

local function format_xsampa(xsampa)
	return '<code>' .. xsampa .. '</code>'
end

function tests:test_convert_xsampa_to_ipa()
	for xsampa, ipa in pairs(testcases) do
		self:equals(format_xsampa(xsampa), format_ipa(m_IPA.XSAMPA_to_IPA(xsampa)), format_ipa(ipa))
	end
end

function tests:test_convert_ipa_to_xsampa()
	for xsampa, ipa in pairs(testcases) do
		self:equals(format_ipa(ipa), format_xsampa(m_IPA.IPA_to_XSAMPA(ipa)), format_xsampa(xsampa))
	end
end

function tests:test_roundtrip_ipa()
	for xsampa, ipa in pairs(testcases) do
		self:equals(format_ipa(ipa), format_ipa(m_IPA.XSAMPA_to_IPA(m_IPA.IPA_to_XSAMPA(ipa))), format_ipa(ipa))
	end
end

function tests:test_roundtrip_xsampa()
	for xsampa, ipa in pairs(testcases) do
		self:equals(format_xsampa(xsampa), format_xsampa(m_IPA.IPA_to_XSAMPA(m_IPA.XSAMPA_to_IPA(xsampa))), format_xsampa(xsampa))
	end
end

return tests