114 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			114 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Factor
		
	
	
|  | ! Copyright (C) 2009 Jeremy Hughes. | ||
|  | ! See http://factorcode.org/license.txt for BSD license. | ||
|  | USING: tools.test alien.cxx.syntax alien.inline.syntax | ||
|  | alien.marshall.syntax alien.marshall accessors kernel ;
 | ||
|  | IN: alien.cxx.syntax.tests | ||
|  | 
 | ||
|  | DELETE-C-LIBRARY: test | ||
|  | C-LIBRARY: test | ||
|  | 
 | ||
|  | COMPILE-AS-C++ | ||
|  | 
 | ||
|  | C-INCLUDE: <string>
 | ||
|  | 
 | ||
|  | C-TYPEDEF: std::string string
 | ||
|  | 
 | ||
|  | C++-CLASS: std::string c++-root | ||
|  | 
 | ||
|  | GENERIC: to-string ( obj -- str )
 | ||
|  | 
 | ||
|  | C++-METHOD: std::string to-string const-char* c_str ( )
 | ||
|  | 
 | ||
|  | CM-FUNCTION: std::string* new_string ( const-char* s )
 | ||
|  |     return new std::string(s); | ||
|  | ;
 | ||
|  | 
 | ||
|  | ;C-LIBRARY | ||
|  | 
 | ||
|  | ALIAS: <std::string> new_string | ||
|  | 
 | ||
|  | { 1 1 } [ new_string ] must-infer-as | ||
|  | { 1 1 } [ c_str_std__string ] must-infer-as | ||
|  | [ t ] [ "abc" <std::string> std::string? ] unit-test | ||
|  | [ "abc" ] [ "abc" <std::string> to-string ] unit-test | ||
|  | 
 | ||
|  | 
 | ||
|  | DELETE-C-LIBRARY: inheritance | ||
|  | C-LIBRARY: inheritance | ||
|  | 
 | ||
|  | COMPILE-AS-C++ | ||
|  | 
 | ||
|  | C-INCLUDE: <cstring> | ||
|  | 
 | ||
|  | <RAW-C | ||
|  | class alpha { | ||
|  |     public: | ||
|  |     alpha(const char* s) { | ||
|  |         str = s; | ||
|  |     }; | ||
|  |     const char* render() { | ||
|  |         return str; | ||
|  |     }; | ||
|  |     virtual const char* chop() { | ||
|  |         return str; | ||
|  |     }; | ||
|  |     virtual int length() { | ||
|  |         return strlen(str); | ||
|  |     }; | ||
|  |     const char* str; | ||
|  | }; | ||
|  | 
 | ||
|  | class beta : alpha { | ||
|  |     public: | ||
|  |     beta(const char* s) : alpha(s + 1) { }; | ||
|  |     const char* render() { | ||
|  |         return str + 1; | ||
|  |     }; | ||
|  |     virtual const char* chop() { | ||
|  |         return str + 2; | ||
|  |     }; | ||
|  | }; | ||
|  | RAW-C> | ||
|  | 
 | ||
|  | C++-CLASS: alpha c++-root | ||
|  | C++-CLASS: beta alpha | ||
|  | 
 | ||
|  | CM-FUNCTION: alpha* new_alpha ( const-char* s )
 | ||
|  |     return new alpha(s); | ||
|  | ;
 | ||
|  | 
 | ||
|  | CM-FUNCTION: beta* new_beta ( const-char* s )
 | ||
|  |     return new beta(s); | ||
|  | ;
 | ||
|  | 
 | ||
|  | ALIAS: <alpha> new_alpha | ||
|  | ALIAS: <beta> new_beta | ||
|  | 
 | ||
|  | GENERIC: render ( obj -- obj )
 | ||
|  | GENERIC: chop ( obj -- obj )
 | ||
|  | GENERIC: length ( obj -- n )
 | ||
|  | 
 | ||
|  | C++-METHOD: alpha render const-char* render ( )
 | ||
|  | C++-METHOD: beta render const-char* render ( )
 | ||
|  | C++-VIRTUAL: alpha chop const-char* chop ( )
 | ||
|  | C++-VIRTUAL: beta chop const-char* chop ( )
 | ||
|  | C++-VIRTUAL: alpha length int length ( )
 | ||
|  | 
 | ||
|  | ;C-LIBRARY | ||
|  | 
 | ||
|  | { 1 1 } [ render_alpha ] must-infer-as | ||
|  | { 1 1 } [ chop_beta ] must-infer-as | ||
|  | { 1 1 } [ length_alpha ] must-infer-as | ||
|  | [ t ] [ "x" <alpha> alpha#? ] unit-test | ||
|  | [ t ] [ "x" <alpha> alpha? ] unit-test | ||
|  | [ t ] [ "x" <beta> alpha? ] unit-test | ||
|  | [ f ] [ "x" <beta> alpha#? ] unit-test | ||
|  | [ 5 ] [ "hello" <alpha> length ] unit-test | ||
|  | [ 4 ] [ "hello" <beta> length ] unit-test | ||
|  | [ "hello" ] [ "hello" <alpha> render ] unit-test | ||
|  | [ "llo" ] [ "hello" <beta> render ] unit-test | ||
|  | [ "ello" ] [ "hello" <beta> underlying>> \ alpha# new swap >>underlying render ] unit-test | ||
|  | [ "hello" ] [ "hello" <alpha> chop ] unit-test | ||
|  | [ "lo" ] [ "hello" <beta> chop ] unit-test | ||
|  | [ "lo" ] [ "hello" <beta> underlying>> \ alpha# new swap >>underlying chop ] unit-test |