โมดูล:การทดสอบหน่วย

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

-- UnitTester ให้การทดสอบหน่วยสำหรับสคริปต์ Lua อื่น ๆ สำหรับรายละเอียด โปรดดู [[Wikipedia:Lua#Unit_testing]]
-- สำหรับเอกสารสำหรับผู้ใช้ โปรดดูหน้าพูดคุย
 UnitTester  ในพื้นที่=  {}

 กรอบท้องถิ่น,  ขีด,  ข้าม
local  result_table_header  =  "{|class= \" wikitable \"\n |+ %s \n ! Text !! Expected !! Actual"
local  result_table_live_sandbox_header  =  "{|class= \" wikitable \"\n |+ %s \n ! !! Test !! Live !! Sandbox !! Expected"

 result_table  ท้องถิ่น=  {  n  =  0  }
ผลลัพธ์ ท้องถิ่น _table_mt  =  {
	แทรก =  ฟังก์ชั่น ( ตนเอง,  ... )
		ท้องถิ่น n  =  ตนเอง_ 
		สำหรับ i  =  1 เลือก( '#' ,  ... ) do  
			 val  ท้องถิ่น=  เลือก( ผม,  ... )
			ถ้า val  ~=  nil  แล้ว
				n  =  n  +  1
				ตัวเอง[ n ]  =  วาล
			จบ
		จบ
		ตัวเอง. =   
	สิ้นสุด,
	insert_format  =  ฟังก์ชัน ( self ,  ... )
		ตนเอง: แทรก( string.format (...))
	สิ้นสุด,
	concat  =  table.concat
}
result_table_mt _ __index  =  result_table_mt
setmetatable ( result_table ,  result_table_mt )

 num_failures  ท้องถิ่น=  0

ฟังก์ชัน first_difference ( s1 ,  s2 )
    ถ้า s1  ==  s2  ให้ส่ง คืน ''  end
    local  max  =  math.min ( # s1 ,  # s2 )
    สำหรับ ฉัน =  1 ,  สูงสุด do
        ถ้า s1 : sub ( i , i )  ~=  s2 : sub ( i , i )  แล้ว กลับมา i  end
    จบ
     ผลตอบแทนสูงสุด +1 
จบ

 ฟังก์ชัน ท้องถิ่นreturn_varargs (...)
	กลับ ...
จบ

ฟังก์ชัน UnitTester : preprocess_equals ( ข้อความคาดหวังตัว เลือก) 
    local  actual  =  frame : ประมวลผลล่วงหน้า( text )
    ถ้า เป็นจริง ==  คาดหวัง แล้ว
        result_table : แทรก( '| ' ,  ขีด)
    อื่น
        result_table : แทรก( '| ' ,  กากบาท)
        num_failures  =  num_failures  +  1
    จบ
    ท้องถิ่น may_nowiki  =  ( ตัวเลือก และ ตัวเลือกโนวิกิ)  และ mw ข้อความ_ noiki หรือreturn_varargs  
    ท้องถิ่น differents_at  =  self _ differents_at  และ ( ' \n | '  ..  first_difference ( คาดหวัง,  เกิดขึ้นจริง))  หรือ ''
    result_table : insert ( ' \n | ' ,  mw . text . nowiki ( text ),  ' \n | ' ,
    	may_nowiki ( คาดหวัง),  ' \n | ' ,  Maybe_nowiki ( จริง),  แตกต่าง_at ,
    	" \n |- \n " )
จบ

ฟังก์ชัน UnitTester : preprocess_equals_many ( prefix ,  suffix ,  case ,  options )
    สำหรับ _ ,  เคส ใน ipairs ( เคส)  do
        self : preprocess_equals ( prefix  ..  case [ 1 ]  ..  suffix ,  case [ 2 ],  ตัวเลือก)
    จบ
จบ

ฟังก์ชัน UnitTester : preprocess_equals_preprocess ( text1 ,  text2 ,  options )
	local  actual  =  frame : preprocess ( text1 ) 										-- <actual> และ <expected> จะแสดงใน <result_table>
	 คาดหวัง ในท้องถิ่น=  เฟรม: ประมวลผลล่วงหน้า( text2 )
	local  actual_for_comp  =  จริง												-- สำเนาของ <actual> ที่อาจแก้ไขให้มี stripmarker สไตล์เทมเพลตเหมือนกับ <คาดหวัง> สำหรับการเปรียบเทียบ
	 ไฮไลต์																ในพื้นที่-- บูลีนจริงเพื่อเน้นการแสดงผลที่ไม่ตรงกันในคอลัมน์ผลลัพธ์จริง

	if  option  และ true  ==  options _ templatestyles  แล้ว							-- เมื่อการแสดงผลโมดูลมีแถบ marker ของ templatestyles ให้ใช้ ID จากที่คาดไว้เพื่อป้องกันการทดสอบที่ผิดพลาด
		 รูปแบบ ท้องถิ่น=  '( \127 [^ \127 ]*UNIQ%-%-templatestyles%-)(%x+)(%-QINU[^ \127 ]* \127 )' 	-- templatestyle stripmarker รูปแบบ
		local  _ , expect_stripmarker_id  = คาด หวัง: ตรงกัน( รูปแบบ) -- รับ templatestyles strip marker id จากที่คาดไว้ (ข้อมูลอ้างอิง); ละเว้นการจับภาพครั้งแรกในรูปแบบ 				

		ถ้า คาดหวัง_stripmarker_id  แล้ว
			actual_for_comp  =  actual_for_comp : gsub ( รูปแบบ,  '%1'  ..  คาดหวัง _stripmarker_id  ..  '%3' ) 	- แทนที่ id จริงด้วย id ที่คาดไว้; ละเว้นการจับภาพครั้งที่สองในรูปแบบ
		จบ
	จบ

	-- ตัวเลือกที่จะละเว้นเครื่องหมายแถบใด ๆ เมื่อเปรียบเทียบที่เกิดขึ้นจริงกับที่คาดไว้
	if  option  และ true  ==  options _ แถบเครื่องหมาย แล้ว
		 รูปแบบ ท้องถิ่น=  '( \127 [^ \127 ]*UNIQ%-%-%l+%-)(%x+)(%-QINU[^ \127 ]* \127 )'
		local  _ , expect_stripmarker_id  = คาด หวัง: ตรงกัน( รูปแบบ) 
		ถ้า คาดหวัง_stripmarker_id  แล้ว
			actual_for_comp  =  actual_for_comp : gsub ( รูปแบบ,  '%1'  ..  คาดหวัง _stripmarker_id  ..  '%3' )
			คาดหวัง =  คาดหวัง: gsub ( รูปแบบ,  '%1'  ..  คาดหวัง _stripmarker_id ..  '%3' )
		จบ
	จบ

	ถ้า actual_for_comp  ==  คาดหวัง แล้ว											-- การเรนเดอร์เหมือนกัน ไหม
		result_table : แทรก( '| ' ,  ขีด)
	อื่น
		result_table : insert ( '| ' ,  cross ) 										-- ไม่; ทำเครื่องหมายว่าล้มเหลว
		num_failures  =  num_failures  +  1 											-- นับ
		ไฮไลต์= จริง															-- และไฮไลต์ตารางผลลัพธ์ เซลล์คอลัมน์จริง (เพื่อให้การทดสอบที่ล้มเหลวชัดเจนยิ่งขึ้น)
	จบ
	ท้องถิ่น may_nowiki  =  ( ตัวเลือก และ ตัวเลือกโนวิกิ)  และ mw ข้อความ_ noiki หรือreturn_varargs  
	ท้องถิ่น differents_at  =  self _ differents_at  และ ( ' \n | '  ..  first_difference ( คาดหวัง,  เกิดขึ้นจริง))  หรือ ''
	result_table : แทรก( ' \n | ' ,
		มิลลิวัตต์ ข้อความ_ noiki ( text1 ), 													-- เทมเพลตที่ทดสอบแล้ว noikied
		' \n | ' ,
		may_nowiki ( คาดหวัง) 													-- เวอร์ชันที่คาดไว้
		ไฮไลต์ และ ' \n |style="background: #fc0;"| '  หรือ ' \n | ' , 				-- ถูกเน้นถ้าการทดสอบล้มเหลว ไม่ใช่อย่างอื่น
		may_nowiki ( จริง),  differents_at , 										-- การเรนเดอร์จริงโดยใช้สไตล์เทมเพลตของตัวเองหากเป็นตัวเลือก
		" \n |- \n " )
จบ

ฟังก์ชัน UnitTester : preprocess_equals_compare ( ใช้งานจริง แซน ด์บ็อกซ์คาดหวังตัวเลือก)   
	local  live_text  =  frame : ประมวลผลล่วงหน้า( live )
	local  sandbox_text  =  frame : ประมวลผลล่วงหน้า( sandbox )

	ท้องถิ่น highlight_live  =  false
	โลคัล highlight_sandbox  =  false
	ถ้า live_text  ==  คาดหวัง และ sandbox_text  ==  คาดหวัง แล้ว
		result_table : แทรก( '| ' ,  ขีด)
	อื่น
		result_table : แทรก( '| ' ,  กากบาท)
		num_failures  =  num_failures  +  1

		ถ้า live_text  ~=  คาดหวัง แล้ว
			highlight_live  =  จริง
		จบ

		ถ้า sandbox_text  ~=  คาดหวัง แล้ว
			highlight_sandbox  =  จริง
		จบ
	จบ
    ท้องถิ่น may_nowiki  =  ( ตัวเลือก และ ตัวเลือกโนวิกิ)  และ mw ข้อความ_ noiki หรือreturn_varargs  
    ท้องถิ่น differents_at  =  self _ differents_at  และ ( ' \n | '  ..  first_difference ( คาดหวัง,  live_text )  หรือ first_difference ( คาดหวัง,  sandbox_text ))  หรือ ''
    result_table : แทรก(
			' \n | ' ,
			มิลลิวัตต์ ข้อความ_ โนวิกิ( สด),
			highlight_live  และ ' \n |style="background: #fc0;"| '  หรือ ' \n | ' ,
			may_nowiki ( live_text )
			highlight_sandbox  และ ' \n |style="background: #fc0;"| '  หรือ ' \n | ' ,
			may_nowiki ( sandbox_text )
			' \n | ' ,
			may_nowiki ( คาดหวัง)
			แตกต่าง_at ,
			" \n |- \n "
	)
จบ

ฟังก์ชัน UnitTester : preprocess_equals_preprocess_many ( prefix1 ,  suffix1 ,  prefix2 ,  suffix2 ,  case ,  options )
    สำหรับ _ ,  เคส ใน ipairs ( เคส)  do
        self : preprocess_equals_preprocess ( prefix1  ..  case [ 1 ]  ..  suffix1 ,  prefix2  ..  ( case [ 2 ]  และ case [ 2 ]  หรือ case [ 1 ])  ..  suffix2 ,  options )
    จบ
จบ

ฟังก์ชัน UnitTester : preprocess_equals_sandbox_many ( module ,  function_name ,  case ,  options )
    สำหรับ _ ,  เคส ใน ipairs ( เคส)  do
		local  live  =  โมดูล ..  "|"  ..  function_name  ..  "|"  ..  กรณี[ 1 ]  ..  "}}"
		 แซนด์บ็อกซ์ ในพื้นที่=  โมดูล ..  "/แซนด์บ็อกซ์|"  ..  function_name  ..  "|"  ..  กรณี[ 1 ]  ..  "}}"
        self : preprocess_equals_compare ( live ,  sandbox ,  case [ 2 ] ,  ตัวเลือก)
    จบ
จบ

ฟังก์ชั่น UnitTester : เท่ากับ( ชื่อ,  จริง,  คาดหวัง,  ตัวเลือก)
    ถ้า เป็นจริง ==  คาดหวัง แล้ว
        result_table : แทรก( '| ' ,  ขีด)
    อื่น
        result_table : แทรก( '| ' ,  กากบาท)
        num_failures  =  num_failures  +  1
    จบ
    ท้องถิ่น may_nowiki  =  ( ตัวเลือก และ ตัวเลือกโนวิกิ)  และ mw ข้อความ_ noiki หรือreturn_varargs  
    ท้องถิ่น differents_at  =  self _ differents_at  และ ( ' \n | '  ..  first_difference ( คาดหวัง,  เกิดขึ้นจริง))  หรือ ''
    local  display  =  ตัวเลือก และ ตัวเลือก แสดงหรือฟังก์ชั่น( x ) ส่งคืนx end     
    result_table : แทรก( ' \n | ' ,  name ,  ' \n | ' ,
    	may_nowiki ( tostring ( แสดง( คาดหวัง)) ),  ' \n | ' ,
    	may_nowiki ( tostring ( display ( จริง)) ),  differents_at ,  " \n |- \n " )
จบ

 ฟังก์ชั่น ท้องถิ่นdeep_compare ( t1 ,  t2 ,  forget_mt )
    ท้องถิ่น ty1  =  ประเภท( t1 )
    ท้องถิ่น ty2  =  ประเภท( t2 )
    ถ้า ty1  ~=  ty2 ให้ คืน ค่า เท็จ end
    ถ้า ty1  ~=  'table'  และ ty2  ~=  'table'  ให้ส่ง คืน t1  ==  t2  end

     mt  ท้องถิ่น=  getmetatable ( t1 )
    ถ้า ไม่ ละเว้น mt และ mt  และ mt __eq จากนั้นส่งคืนt1 == t2 end      

    สำหรับ k1 ,  v1  ใน คู่( t1 )  do
        ท้องถิ่น v2  =  t2 [ k1 ]
        ถ้า v2  ==  ไม่มี หรือ ไม่ deep_compare ( v1 ,  v2 )  ให้ คืนค่า ปลายเท็จ 
    จบ
    สำหรับ k2 ,  v2  ใน คู่( t2 )  do
        ท้องถิ่น v1  =  t1 [ k2 ]
        ถ้า v1  ==  ไม่มี หรือ ไม่ deep_compare ( v1 ,  v2 )  ให้ คืนค่า ปลายเท็จ 
    จบ

    คืน ความจริง
จบ

ฟังก์ชัน val_to_str ( v )
    ถ้า ประเภท( v )  ==  'string'  แล้ว
        วี =  มิลลิวัตต์ อึดอัด_ gsub ( v ,  ' \n ' ,  ' \\ n' )
        ถ้า mw _ อึดอัด_ ตรงกัน( mw . ustring . gsub ( v ,  '[^ \' "]' ,  '' ),  '^"+$' )  แล้ว
            กลับ "'"  ..  วี ..  "'"
        จบ
        ส่งคืน '"'  ..  mw . ustring . gsub ( v ,  '"' ,  ' \\ "'  )  ..  '"'
    อื่น
         ประเภท การ ส่งคืน( v )  ==  'table'  และ table_to_str ( v )  หรือ tostring ( v )
    จบ
จบ

ฟังก์ชัน table_key_to_str ( k )
    ถ้า ประเภท( k )  ==  ' string'  และ mw อึดอัด_ ตรงกัน( k , '^[_%a][_%a%d]*$' ) แล้ว  
        กลับ k
    อื่น
        ส่งคืน '['  ..  val_to_str ( k )  ..  ']'
    จบ
จบ

ฟังก์ชัน table_to_str ( tbl )
     ผลลัพธ์ใน ท้องถิ่นเสร็จสิ้น =  {},  {}
    สำหรับ k ,  v  ใน ipairs ( tbl )  do
        table.insert ( ผลลัพธ์,  val_to_str ( v ))
        เสร็จสิ้น[ k ]  =  จริง
    จบ
    สำหรับ k ,  v  เป็น คู่( tbl )  do
        ถ้า ไม่ ทำ[ k ]  แล้ว
            table.insert ( ผลลัพธ์,  table_key_to_str ( k )  ..  '='  ..  val_to_str ( v ))
        จบ
    จบ
    ส่งคืน '{'  ..  table.concat ( ผล,  ',' )  ..  '}'
จบ

ฟังก์ชั่น UnitTester : equals_deep ( ชื่อ,  จริง,  คาดหวัง,  ตัวเลือก)
    ถ้า deep_compare ( จริง,  คาดหวัง)  แล้ว
        result_table : แทรก( '| ' ,  ขีด)
    อื่น
        result_table : แทรก( '| ' ,  กากบาท)
        num_failures  =  num_failures  +  1
    จบ
    ท้องถิ่น may_nowiki  =  ( ตัวเลือก และ ตัวเลือกโนวิกิ)  และ mw ข้อความ_ noiki หรือreturn_varargs  
    ท้องถิ่น actual_str  =  val_to_str ( จริง)
     คาดหวัง ในท้องถิ่น=  val_to_str ( คาดหวัง)
    ท้องถิ่น differents_at  =  self _ differents_at  และ ( ' \n | '  ..  first_difference ( คาดหวัง _str ,  actual_str ))  หรือ ''
    result_table : แทรก( ' \n | ' ,  ชื่อ,  ' \n | ' ,  อาจ_nowiki ( คาดหวัง _str ),
    	' \n | ' ,  Maybe_nowiki ( actual_str )  ต่างกัน,  " \n |- \n " )
จบ

ฟังก์ชัน UnitTester : iterate ( Examples ,  func )
	ต้องการ '  libraryUtil ' checkType ( 'วนซ้ำ' , 1 , ตัวอย่าง, 'ตาราง' )   
	ถ้า ประเภท( func )  ==  'string'  แล้ว
		func  =  ตัวเอง[ func ]
	 ประเภทelseif ( func )  ~=  'ฟังก์ชัน'  แล้ว
		ข้อผิดพลาด(( "อาร์กิวเมนต์ไม่ถูกต้อง #2 ถึง 'วนซ้ำ' (ฟังก์ชันหรือสตริงที่คาดหวัง ได้ %s)" )
			: รูปแบบ( ประเภท( func ) ),  2 )
	จบ

	สำหรับ ฉันตัวอย่างในipairs ( ตัวอย่าง) do _    
		ถ้า ประเภท( ตัวอย่าง)  ==  'ตาราง'  แล้ว
			func ( self ,  แกะ( ตัวอย่าง) )
		 ประเภทelseif ( ตัวอย่าง)  ==  'string'  แล้ว
			ตนเอง: หัวเรื่อง( ตัวอย่าง)
		อื่น
			ข้อผิดพลาด(( 'ตัวอย่างที่ไม่ดี #%d (ตารางที่คาดไว้, ได้ %s)' )
				: รูปแบบ( i ,  พิมพ์( ตัวอย่าง) ),  2 )
		จบ
	จบ
จบ

ฟังก์ชัน UnitTester : หัวข้อ( ข้อความ)
	result_table : insert_format ( ' ! colspan="%u" style="text-align: left" | %s \n |- \n ' ,
		ตัวเอง. คอลัมน์ข้อความ) _ 
จบ

ฟังก์ชัน UnitTester : วิ่ง( frame_arg )
    เฟรม =  frame_arg
    ตัวเอง. เฟรม =  เฟรม
    ตัวเอง. differents_at  =  เฟรม_ args [ 'differs_at' ]
    ขีด =  กรอบ: ประมวลผลล่วงหน้า( '{{Tick}}' )
    cross  =  frame : พรีโพรเซ ส ( '{{Cross}}' )

	local  table_header  =  result_table_header
	ถ้า เฟรม. args [ 'live_sandbox' ]  แล้ว
		table_header  =  result_table_live_sandbox_header
	จบ

	ตัวเอง. คอลัมน์ =  4
    ถ้า ตัวเอง. แตกต่าง_ที่ แล้ว
        table_header  =  table_header  ..  ' !! แตกต่างที่'
        ตัวเอง. คอลัมน์ =  ตัวเอง คอลัมน์+ 1  
    จบ

    - เรียงลำดับผลลัพธ์ตามลำดับตัวอักษร
    ท้องถิ่น self_sorted  =  {}
    สำหรับ คีย์,  _  ใน คู่( ตัวเอง)  do
        if  key : find ( '^test' )  แล้ว
            table.insert ( self_sorted ,  คีย์)
        จบ
    จบ
    table.sort ( self_sorted )
    - เพิ่มผลลัพธ์ลงในตารางผลลัพธ์
    สำหรับ _ ค่าในipairs ( self_sorted ) do _    
        result_table : insert_format ( table_header  ..  " \n |- \n " ,  ค่า)
        ตนเอง[ คุณค่า] ( ตนเอง)
        result_table : แทรก( "|} \n " )
    จบ

    return  ( num_failures  ==  0  และ "<b style= \" color:#008000 \" >การทดสอบทั้งหมดผ่าน</b>"  หรือ "<b style= \" color:#800000 \" >  " ..  num_failures  .  " การทดสอบล้มเหลว</b>[[Category:Failed Lua testcases using Module:UnitTests]]" )  ..  " \n\n "  ..  frame : preprocess ( result_table : concat ())
จบ

ฟังก์ชัน UnitTester : ใหม่()
    ท้องถิ่น o  =  {}
    ตั้งค่าได้( o ,  ตนเอง)
    ตัวเอง. __index  =  ตัวเอง
    กลับ o
จบ

local  p  =  UnitTester : ใหม่()
ฟังก์ชัน หน้า. run_tests ( frame )  return  p : วิ่ง( frame )  end
กลับ p