diff options
Diffstat (limited to 'unicode/biditest2.C')
| -rw-r--r-- | unicode/biditest2.C | 80 | 
1 files changed, 77 insertions, 3 deletions
diff --git a/unicode/biditest2.C b/unicode/biditest2.C index 8e9d7da..a14b3ea 100644 --- a/unicode/biditest2.C +++ b/unicode/biditest2.C @@ -204,14 +204,14 @@ void character_test()  			? unicode::bidi_calc(s, direction)  			: unicode::bidi_calc(s); -		if (std::get<1>(ret) != paragraph_embedding_level) +		if (std::get<1>(ret).direction != paragraph_embedding_level)  		{  			std::cerr << "Regression, line "  				  << linenum  				  << ": expected "  				  << paragraph_embedding_level  				  << " paragraph embedding level, got " -				  << (int)std::get<1>(ret) +				  << (int)std::get<1>(ret).direction  				  << std::endl;  			exit(1);  		} @@ -274,6 +274,9 @@ void character_test()  				 std::reverse(b+index, b+index+n);  			 }); +		size_t cleaned_size=unicode_bidi_cleaned_size(s.c_str(), +							      s.size(), 0); +  		n=0;  		unicode::bidi_cleanup  			(s, levels, @@ -285,6 +288,17 @@ void character_test()  				 ++n;  			 }); +		if (cleaned_size != s.size()) +		{ +			std::cerr << "Regression, line " +				  << linenum +				  << ": default cleaned size" +				  << std::endl +				  << "   Expected size: " << cleaned_size +				  << ", actual size: " << s.size() +				  << std::endl; +			exit(1); +		}  		if (render_order != actual_render_order)  		{  			std::cerr << "Regression, line " @@ -408,6 +422,12 @@ void character_test()  			}  			unicode::bidi_reorder(new_string, std::get<0>(ret)); + +			cleaned_size=unicode_bidi_cleaned_size +				(new_string.c_str(), +				 new_string.size(), +				 UNICODE_BIDI_CLEANUP_CANONICAL); +  			unicode::bidi_cleanup(new_string,  					      std::get<0>(ret),  					      [] @@ -416,6 +436,20 @@ void character_test()  					      },  					      UNICODE_BIDI_CLEANUP_CANONICAL); +			if (cleaned_size != new_string.size()) +			{ +				std::cerr << "Regression, line " +					  << linenum +					  << ": canonoical cleaned size" +					  << std::endl +					  << "   Expected size: " +					  << cleaned_size +					  << ", actual size: " +					  << new_string.size() +					  << std::endl; +				exit(1); +			} +  			/* New string is now back in logical order */  			if (new_string == s && std::get<0>(ret) == levels) @@ -548,34 +582,62 @@ void null_character_test()  			      },  			      UNICODE_BIDI_CLEANUP_EXTRA,  			      0, 3); + +	s=U""; +	res=unicode::bidi_calc(s, UNICODE_BIDI_RL); + +	if (std::get<1>(res).direction != UNICODE_BIDI_RL) +	{ +		std::cerr << "Paragraph embedding level not honored" +			  << std::endl; +		exit(1); +	}  }  void direction_test()  {  	static const struct { -		const char32_t *str; +		std::u32string str;  		unicode_bidi_level_t direction;  		int is_explicit; +		bool needs_embed;  	} tests[]={  		{  			U"Hello",  			UNICODE_BIDI_LR,  			1, +			true,  		},  		{  			U" ",  			UNICODE_BIDI_LR,  			0, +			true,  		},  		{  			U"",  			UNICODE_BIDI_LR,  			0, +			true,  		},  		{  			U"שלום",  			UNICODE_BIDI_RL,  			1, +			true, +		}, +		{ +			U"Helloש", +			UNICODE_BIDI_LR, +			1, +			true, +		}, +		{ +			U"Hello" + std::u32string{unicode::literals::LRO} +			+ U"ש", +			UNICODE_BIDI_LR, +			1, +			false,  		},  	}; @@ -589,6 +651,18 @@ void direction_test()  			std::cerr << "direction_test failed\n";  			exit(1);  		} + +		std::u32string s=t.str; +		auto levels=std::get<0>(unicode::bidi_calc(s, t.direction)); +		unicode::bidi_reorder(s, levels); +		unicode::bidi_cleanup(s, levels); + +		if (unicode::bidi_needs_embed(s, levels, &t.direction) +		    != t.needs_embed) +		{ +			std::cerr << "needs embed failed\n"; +			exit(1); +		}  	}  }  | 
