Changeset 3287

Show
Ignore:
Timestamp:
01/05/09 08:45:24 (11 months ago)
Author:
jmaessen
Message:

Renamed JavaString to FlatString in line with discussion. This will
hopefully mitigate confusion a teensy bit when java.lang.String is
wrapped differently than it is now.

Location:
trunk
Files:
16 modified
4 moved

Legend:

Unmodified
Added
Removed
  • trunk/Library/CompilerLibrary.fsi

    r3242 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1818api CompilerLibrary 
    1919 
    20 print(s:JavaString): () 
    21 println(s:JavaString): () 
     20print(s:FlatString): () 
     21println(s:FlatString): () 
    2222 
    2323trait String 
  • trunk/Library/CompilerLibrary.fss

    r3242 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1919export CompilerLibrary 
    2020 
    21 print(s:JavaString): () = builtinPrimitive("com.sun.fortress.interpreter.glue.prim.StringPrim$Print") 
    22 println(s:JavaString): () = builtinPrimitive("com.sun.fortress.interpreter.glue.prim.StringPrim$Println") 
     21print(s:FlatString): () = builtinPrimitive("com.sun.fortress.interpreter.glue.prim.StringPrim$Print") 
     22println(s:FlatString): () = builtinPrimitive("com.sun.fortress.interpreter.glue.prim.StringPrim$Println") 
    2323 
    2424trait String 
  • trunk/Library/File.fsi

    r3057 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1717 
    1818api File 
    19 import JavaString.JavaString 
     19import FlatString.FlatString 
    2020import FileSupport.{...} 
    2121 
     
    103103(** A %FileWriteStream% represents a writable stream backed by a file 
    104104    named %fileName%. **) 
    105      
     105 
    106106FileWriteStream(fileName:String):  FileWriteStream 
    107      
    108 object FileWriteStream(fileName:JavaString) extends { FileStream } 
     107 
     108object FileWriteStream(fileName:FlatString) extends { FileStream } 
    109109    getter fileName(): String 
    110110 
    111     (** %write(JavaString)% and %write(Char)% are the primitive mechanisms for writing 
     111    (** %write(FlatString)% and %write(Char)% are the primitive mechanisms for writing 
    112112        characters to the end of a %FileWriteStream%. **) 
    113     write(x:JavaString):() 
     113    write(x:FlatString):() 
    114114    write(c:Char):() 
    115115    (** %write(Any)% converts its argument to a String using %toString% 
  • trunk/Library/File.fss

    r3179 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1717 
    1818native component File 
    19 import JavaString.JavaString 
     19import FlatString.FlatString 
    2020import FileSupport.{...} 
    2121export File 
     
    2424private package="com.sun.fortress.interpreter.glue.prim" 
    2525 
    26 FileReadStream(filename: String): FileReadStream = FileReadStream(filename.asJavaString) 
     26FileReadStream(filename: String): FileReadStream = FileReadStream(filename.asFlatString) 
    2727 
    28 object FileReadStream(filename: JavaString) 
     28object FileReadStream(filename: FlatString) 
    2929        extends { ReadStream, FileStream } 
    3030    getter fileName():String = 
     
    6868end 
    6969 
    70 FileWriteStream(fileName:String) = FileWriteStream(fileName.asJavaString) 
     70FileWriteStream(fileName:String) = FileWriteStream(fileName.asFlatString) 
    7171 
    72 object FileWriteStream(fileName:JavaString) extends { FileStream } 
     72object FileWriteStream(fileName:FlatString) extends { FileStream } 
    7373    getter fileName(): String = 
    7474      builtinPrimitive( 
     
    7777      builtinPrimitive( 
    7878        "com.sun.fortress.interpreter.glue.prim.FileWriteStream$toString") 
    79     write(s:JavaString):() = 
     79    write(s:FlatString):() = 
    8080      builtinPrimitive( 
    8181        "com.sun.fortress.interpreter.glue.prim.FileWriteStream$write") 
     
    8888        write((BIG ||[e <- x] 
    8989                   typecase e of 
    90                         JavaString => e 
    91                         String => e.asJavaString 
    92                         else   => ("" e).asJavaString 
     90                        FlatString => e 
     91                        String => e.asFlatString 
     92                        else   => ("" e).asFlatString 
    9393                   end) r) 
    9494    writes(x:Generator[\Any\]):() = writes(x,"") 
  • trunk/Library/FlatString.fsi

    r3196 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1616 ******************************************************************************) 
    1717 
    18 api JavaString 
     18api FlatString 
    1919 
    20   lineSeparator: String  
    21    
    22   object JavaString extends { String } 
    23     opr ||(self, b:JavaString): String 
     20  lineSeparator: String 
     21 
     22  object FlatString extends { String } 
     23    opr ||(self, b:FlatString): String 
    2424    opr ||(self, b:String):String 
    25     opr ||(self, b:Char): String          
    26     opr ||(a:JavaString, self): String   
    27     javaConcat(self, b:JavaString):String 
    28     javaConcat(self, b:Char):String 
     25    opr ||(self, b:Char): String 
     26    opr ||(a:FlatString, self): String 
     27    flatConcat(self, b:FlatString):String 
     28    flatConcat(self, b:Char):String 
    2929  end 
    30      
     30 
    3131end 
  • trunk/Library/FlatString.fss

    r3242 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1616 ******************************************************************************) 
    1717 
    18 native component JavaString 
     18native component FlatString 
    1919 
    2020import String.{maxLeafSize, concatAndBalanceIfNecessary, CatString, spaces} 
    2121import Stream.{...} 
    2222 
    23 export JavaString 
     23export FlatString 
    2424 
    2525 
     
    3333 
    3434private LineSeparator(): String =do 
    35     JavaString; (* This initializes the constructor for JavaString 
     35    FlatString; (* This initializes the constructor for FlatString 
    3636                   before its type is used (in the next line). *) 
    3737    natLineSeparator() 
    3838  end 
    3939 
    40 object JavaString extends { String, DelegatedIndexed⟦Char, ZZ32⟧ } 
     40object FlatString extends { String, DelegatedIndexed⟦Char, ZZ32⟧ } 
    4141    getter size() : ZZ32 = 
    42         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$Size") 
     42        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$Size") 
    4343    getter asExprString() : String = 
    44         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$ToString") 
    45     getter asJavaString(): String = self 
     44        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$ToString") 
     45    getter asFlatString(): String = self 
    4646    getter asStriing(): String = self 
    4747    getter asDebugString(): String = asDebugStringIndented(0) 
     
    5757 
    5858    opr |self| : ZZ32 = 
    59         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$Size") 
     59        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$Size") 
    6060 
    6161    uncheckedSubstring(r1: Range⟦ZZ32⟧) : String = do 
    6262    (* We could build a subString node here, but not until everything is working, 
    6363        because that will introduce 
    64        SubString objects into code that may still expect JavaStrings. 
    65        As written, this method always answers a JavaString. 
    66        In any case, the JavaString object supports substring without copying*) 
     64       SubString objects into code that may still expect FlatStrings. 
     65       As written, this method always answers a FlatString. 
     66       In any case, the FlatString object supports substring without copying*) 
    6767        assert((r1 ∩ self.bounds).isEmpty, r1.isEmpty, 
    6868                    "Empty substring of non-empty string") 
     
    7272    end 
    7373 
    74     opr =(self, other: JavaString): Boolean = 
    75         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$Eq") 
    76     opr <(self, other: JavaString): Boolean = self.cmp(other) < 0 
    77     opr <=(self, other: JavaString): Boolean = self.cmp(other) ≤ 0 
    78     opr >(self, other: JavaString): Boolean = self.cmp(other) > 0 
    79     opr >=(self, other: JavaString): Boolean = self.cmp(other) ≥ 0 
    80     opr CMP(self, other: JavaString): TotalComparison =  self.cmp(other) CMP 0 
     74    opr =(self, other: FlatString): Boolean = 
     75        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$Eq") 
     76    opr <(self, other: FlatString): Boolean = self.cmp(other) < 0 
     77    opr <=(self, other: FlatString): Boolean = self.cmp(other) ≤ 0 
     78    opr >(self, other: FlatString): Boolean = self.cmp(other) > 0 
     79    opr >=(self, other: FlatString): Boolean = self.cmp(other) ≥ 0 
     80    opr CMP(self, other: FlatString): TotalComparison =  self.cmp(other) CMP 0 
    8181    opr CMP(self, other:String):TotalComparison = INVERSE (other CMP self) 
    82     opr CASE_INSENSITIVE_CMP(self, other:JavaString): TotalComparison = 
     82    opr CASE_INSENSITIVE_CMP(self, other:FlatString): TotalComparison = 
    8383      self.cicmp(other) CMP 0 
    8484    opr CASE_INSENSITIVE_CMP(self, other:String): TotalComparison = INVERSE (other CASE_INSENSITIVE_CMP self) 
     
    8686    (** get skips bounds checking. **) 
    8787    get(i:ZZ32): Char = 
    88         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$Index") 
    89     cmp(other:JavaString): ZZ32 = 
    90         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$Cmp") 
    91     cicmp(other:JavaString): ZZ32 = 
    92         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$CICmp") 
     88        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$Index") 
     89    cmp(other:FlatString): ZZ32 = 
     90        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$Cmp") 
     91    cicmp(other:FlatString): ZZ32 = 
     92        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$CICmp") 
    9393    javaSubstr(lo:ZZ32,hi:ZZ32): String = 
    94         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$Substr") 
     94        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$Substr") 
    9595    javaIndexOf(c:Char): ZZ32 = 
    96         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$IndexOf") 
    97     javaConcat(self, b:JavaString):String = 
    98         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$Concat") 
    99     javaConcat(self, b:Char):String = 
    100         builtinPrimitive("com.sun.fortress.interpreter.glue.prim.JavaString$Concat") 
     96        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$IndexOf") 
     97    flatConcat(self, b:FlatString):String = 
     98        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$Concat") 
     99    flatConcat(self, b:Char):String = 
     100        builtinPrimitive("com.sun.fortress.interpreter.glue.prim.FlatString$Concat") 
    101101 
    102102    indexOf(c:Char): Maybe⟦ZZ32⟧ = do 
     
    118118    (** The operator %||% with at least one String argument converts to string and 
    119119        concatenates **) 
    120     opr ||(self, b:JavaString): String = do 
     120    opr ||(self, b:FlatString): String = do 
    121121        if b.isEmpty then self 
    122122        elif self.size + b.size > maxLeafSize then 
     
    124124            CatString(self, b) 
    125125        else 
    126             javaConcat(self, b) 
     126            flatConcat(self, b) 
    127127        end 
    128128      end 
     
    134134            concatAndBalanceIfNecessary(self, b) 
    135135        else 
    136             javaConcat(self, b.asJavaString) 
     136            flatConcat(self, b.asFlatString) 
    137137        end 
    138138    end 
     
    142142            concatAndBalanceIfNecessary(self, b.asString) 
    143143        else 
    144             javaConcat(self, b) 
     144            flatConcat(self, b) 
    145145        end 
    146146 
     
    150150    writeOn(stream: WriteStream): () = stream.write(self) 
    151151 
    152 end JavaString 
     152end FlatString 
    153153 
    154154end 
  • trunk/Library/FortressLibrary.fsi

    r3201 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1919 
    2020import Stream.WriteStream 
    21 import JavaString.JavaString 
     21import FlatString.FlatString 
    2222import String.StringStats 
    2323 
     
    21212121    getter indices() : CompactFullRange[\ZZ32\] 
    21222122    getter depth() : ZZ32 
    2123     getter asJavaString(): String 
     2123    getter asFlatString(): String 
    21242124    getter isBalanced(): Boolean 
    21252125 
     
    22242224random(a:Number):RR64 
    22252225 
    2226 match(regex:JavaString,some:JavaString):Boolean 
     2226match(regex:FlatString,some:FlatString):Boolean 
    22272227 
    22282228(** %char% converts an integer unicode code point into the 
  • trunk/Library/FortressLibrary.fss

    r3237 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1919import NativeArray.{...} 
    2020import NatReflect.{...} 
    21 import JavaString.{...} 
     21import FlatString.{...} 
    2222import RangeInternals.{...} 
    2323import List.{AnyList} 
     
    36333633    getter generator() : Generator[\Char\] = 
    36343634        self.indices.map[\Char\](fn (i:ZZ32):Char => self[i]) 
    3635     getter asJavaString(): String 
     3635    getter asFlatString(): String 
    36363636 
    36373637    opr |self| : ZZ32 = self.size 
     
    38123812strToInt(s: String): ZZ32 = strToInt(s,10) 
    38133813 
    3814 match(regex:JavaString,some:JavaString):Boolean = builtinPrimitive("com.sun.fortress.interpreter.glue.prim.StringPrim$Match") 
     3814match(regex:FlatString,some:FlatString):Boolean = builtinPrimitive("com.sun.fortress.interpreter.glue.prim.StringPrim$Match") 
    38153815 
    38163816(** postfix %//% appends a single line separator.  The postfix version 
  • trunk/Library/Reader.fsi

    r3196 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1717 
    1818api Reader 
    19 import JavaString.JavaString 
     19import FlatString.FlatString 
    2020import Stream.{...} 
    2121stdIn: Reader 
  • trunk/Library/Reader.fss

    r3196 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1717 
    1818native component Reader 
    19 import JavaString.JavaString 
     19import FlatString.FlatString 
    2020import Stream.{...} 
    2121export Reader 
     
    2424package="com.sun.fortress.interpreter.glue.prim" 
    2525 
    26     stdIn: Reader = InReader() 
    27       
    28     private InReader(): Reader =  builtinPrimitive( 
    29             "com.sun.fortress.interpreter.glue.prim.Reader$inputReader") 
    30      
    31     object Reader(fileName: String) extends { ReadStream } 
    32         getter asString(): String = "Reader on " self.fileName.asExprString 
    33         getter fileName(): String = 
    34           builtinPrimitive( 
    35             "com.sun.fortress.interpreter.glue.prim.Reader$fileName") 
    36      
    37         getter eof():Boolean = 
    38           builtinPrimitive( 
    39             "com.sun.fortress.interpreter.glue.prim.Reader$eof") 
    40      
    41         getter isReady():Boolean = 
    42           builtinPrimitive( 
    43             "com.sun.fortress.interpreter.glue.prim.Reader$ready") 
    44      
    45         whenUnconsumed():() = 
    46           builtinPrimitive( 
    47             "com.sun.fortress.interpreter.glue.prim.Reader$whenUnconsumed") 
    48         consume():() = 
    49           builtinPrimitive( 
    50             "com.sun.fortress.interpreter.glue.prim.Reader$consume") 
    51      
    52         uncheckedReadLine():String = 
    53           builtinPrimitive( 
    54             "com.sun.fortress.interpreter.glue.prim.Reader$readLine") 
    55      
    56         uncheckedReadChar():ZZ32 = 
    57           builtinPrimitive( 
    58             "com.sun.fortress.interpreter.glue.prim.Reader$readChar") 
    59      
    60         uncheckedRead(k:ZZ32):String = 
    61           builtinPrimitive( 
    62             "com.sun.fortress.interpreter.glue.prim.Reader$readk") 
    63      
    64         close():() = 
    65           builtinPrimitive( 
    66             "com.sun.fortress.interpreter.glue.prim.Reader$close") 
    67     end Reader 
    68      
     26stdIn: Reader = InReader() 
     27 
     28private InReader(): Reader =  builtinPrimitive( 
     29        "com.sun.fortress.interpreter.glue.prim.Reader$inputReader") 
     30 
     31object Reader(fileName: String) extends { ReadStream } 
     32    getter asString(): String = "Reader on " self.fileName.asExprString 
     33    getter fileName(): String = 
     34      builtinPrimitive( 
     35        "com.sun.fortress.interpreter.glue.prim.Reader$fileName") 
     36 
     37    getter eof():Boolean = 
     38      builtinPrimitive( 
     39        "com.sun.fortress.interpreter.glue.prim.Reader$eof") 
     40 
     41    getter isReady():Boolean = 
     42      builtinPrimitive( 
     43        "com.sun.fortress.interpreter.glue.prim.Reader$ready") 
     44 
     45    whenUnconsumed():() = 
     46      builtinPrimitive( 
     47        "com.sun.fortress.interpreter.glue.prim.Reader$whenUnconsumed") 
     48    consume():() = 
     49      builtinPrimitive( 
     50        "com.sun.fortress.interpreter.glue.prim.Reader$consume") 
     51 
     52    uncheckedReadLine():String = 
     53      builtinPrimitive( 
     54        "com.sun.fortress.interpreter.glue.prim.Reader$readLine") 
     55 
     56    uncheckedReadChar():ZZ32 = 
     57      builtinPrimitive( 
     58        "com.sun.fortress.interpreter.glue.prim.Reader$readChar") 
     59 
     60    uncheckedRead(k:ZZ32):String = 
     61      builtinPrimitive( 
     62        "com.sun.fortress.interpreter.glue.prim.Reader$readk") 
     63 
     64    close():() = 
     65      builtinPrimitive( 
     66        "com.sun.fortress.interpreter.glue.prim.Reader$close") 
     67end Reader 
     68 
    6969end 
  • trunk/Library/Stream.fsi

    r3235 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1717 
    1818api Stream 
    19 import JavaString.JavaString 
     19import FlatString.FlatString 
    2020 
    2121(*********************************************************** 
     
    3838trait WriteStream extends { Closeable } 
    3939 
    40     (** %write(JavaString)% and %write(Char)% are the primitive mechanisms 
     40    (** %write(FlatString)% and %write(Char)% are the primitive mechanisms 
    4141        for writing characters to the end of a %WriteStream%. 
    42         write(JavaString) need not be part of this api, since it is covered by 
     42        write(FlatString) need not be part of this api, since it is covered by 
    4343        write(String) **) 
    4444 
  • trunk/Library/Stream.fss

    r3235 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1717 
    1818component Stream 
    19 import JavaString.JavaString 
     19import FlatString.FlatString 
    2020export Stream 
    2121 
     
    3939trait WriteStream extends { Closeable } 
    4040 
    41     (** %write(JavaString)% and %write(Char)% are the primitive mechanisms 
     41    (** %write(FlatString)% and %write(Char)% are the primitive mechanisms 
    4242        for writing characters to  a %WriteStream%. **) 
    4343 
  • trunk/Library/String.fss

    r3196 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1818component String 
    1919import List.{...} 
    20 import JavaString.{...} 
     20import FlatString.{...} 
    2121import Stream.{...} 
    2222export String 
    2323 
    24 (* fib is an array of Fibonacci numbers.   We start with  
     24(* fib is an array of Fibonacci numbers.   We start with 
    2525    fib[0] = 0 so that the empty string does not have to be a special case. *) 
    2626  fib = do 
     
    4242    opr || (self, _:EmptyString): String = self 
    4343    opr || (self, other:Char) = concatAndBalanceIfNecessary(self, other.asString) 
    44      
     44 
    4545  end Concatenable 
    4646 
     
    5050    getter isExtremelyUnbalanced() = self.depth > 30 AND: (¬ self.isBalanced) 
    5151  end Balanceable 
    52    
     52 
    5353(* 
    5454==== CatString ==== 
     
    5959    concatAndBalanceIfNecessary(s1: String, s2: String) = do 
    6060        result = CatString(s1, s2) 
    61         if result.isExtremelyUnbalanced  
     61        if result.isExtremelyUnbalanced 
    6262            then result.balanced() 
    6363            else result 
    6464        end 
    6565      end 
    66        
    67     concatAndBalanceIfNecessary(s1: CatString, s2: JavaString) = do 
    68         (* This handles the case where s1.right is a short JavaString *) 
     66 
     67    concatAndBalanceIfNecessary(s1: CatString, s2: FlatString) = do 
     68        (* This handles the case where s1.right is a short FlatString *) 
    6969        typecase r = s1.right of 
    70             JavaString ⇒ if |r| + |s2| ≤ maxLeafSize then  
    71                                         s1.left || javaConcat(r, s2) 
     70            FlatString ⇒ if |r| + |s2| ≤ maxLeafSize then 
     71                                        s1.left || flatConcat(r, s2) 
    7272                                    else 
    7373                                        concatAndBalanceIfNecessary(s1 asif String, s2) 
     
    7878 
    7979(* Object *) 
    80          
     80 
    8181  object CatString(left: String, right:String)  extends {Concatenable, Balanceable} 
    8282    size = left.size + right.size 
     
    8686    getter generator() = ConcatGenerator(left.generator, right.generator) 
    8787    (* if this were to be used heavily, we should collect the result in a StringBuffer *) 
    88     getter asJavaString() = javaConcat(left.asJavaString, right.asJavaString) 
    89     getter asExprString() = left.asExprString.allButLast() || right.asExprString.allButFirst  
     88    getter asFlatString() = flatConcat(left.asFlatString, right.asFlatString) 
     89    getter asExprString() = left.asExprString.allButLast() || right.asExprString.allButFirst 
    9090    getter asDebugString(): String = asDebugStringIndented(0) 
    91      
     91 
    9292    generate⟦R⟧(r: Reduction⟦R⟧, body: Char→R): R = 
    9393            r.join(left.generate(r, body), right.generate(r, body)) 
     
    9595    opr ∈ (c:Char, self): Boolean = (c IN left) OR (c IN right) 
    9696 
    97     opr CMP(self, other: String)  
    98     (*) ensures {outcome = (self.asJavaString CMP other.asJavaString)}  
     97    opr CMP(self, other: String) 
     98    (*) ensures {outcome = (self.asFlatString CMP other.asFlatString)} 
    9999    = do 
    100100      result = 
     
    105105            (left CMP other[0#|left|]) LEXICO: (right CMP other[(|left|):]) LEXICO: (|self| CMP |other|) 
    106106        end 
    107       if result ≠ (self.asJavaString CMP other.asJavaString) then 
     107      if result ≠ (self.asFlatString CMP other.asFlatString) then 
    108108        errorPrintln "Callee Failure, self = " self.asDebugString ", CMP other = " other.asDebugString 
    109109        errorPrintln "result = " result 
     
    112112    end 
    113113 
    114     opr CASE_INSENSITIVE_CMP(self, other:String): TotalComparison  
    115     (*) ensures {outcome = (self.asJavaString CASE_INSENSITIVE_CMP other.asJavaString)}  
     114    opr CASE_INSENSITIVE_CMP(self, other:String): TotalComparison 
     115    (*) ensures {outcome = (self.asFlatString CASE_INSENSITIVE_CMP other.asFlatString)} 
    116116    = 
    117117        if |left| ≥ |other| 
     
    132132    end 
    133133 
    134     asDebugStringIndented(indent: ZZ32): String =  
     134    asDebugStringIndented(indent: ZZ32): String = 
    135135        (spaces(indent) || self.balanceIndicator() || "C" || self.size "/" self.depth || ":")  // 
    136136        left.asDebugStringIndented(indent+8) // 
    137137        right.asDebugStringIndented(indent+8) 
    138138 
    139     balanceIndicator() =  
     139    balanceIndicator() = 
    140140        if self.isBalanced then "B" elif self.isAlmostBalanced then "b" else "u" end 
    141141 
    142142    uncheckedSubstring(r0: Range⟦ZZ32⟧) = label method 
    143         (* printlnWithThread ("CatString.uncheckedSubstring " self "[" r0 "]").asJavaString *) 
     143        (* printlnWithThread ("CatString.uncheckedSubstring " self "[" r0 "]").asFlatString *) 
    144144        if r0.isEmpty then exit method with EmptyString end 
    145145        if r0 = self.bounds then exit method with self end 
     
    162162    splitWithOffsets(): Generator⟦(ZZ32, String)⟧ = ⟨⟦(ZZ32, String)⟧ (0, left), (|left|, right) ⟩ 
    163163    split(): Generator⟦String⟧ =  ⟨⟦String⟧ piece | (_, piece) ← self.splitWithOffsets() ⟩ 
    164      
    165     balanced()  
    166     (*) ensures {outcome = self ∧ outcome.isAlmostBalanced}  
     164 
     165    balanced() 
     166    (*) ensures {outcome = self ∧ outcome.isAlmostBalanced} 
    167167    = 
    168168      label method 
     
    182182        |sequence[i]| = 0 ∨  fib[i] ≤ |sequence[i]| < fib[i+1]  } *) 
    183183 
    184     getter contents()  
    185     (*) ensures { |outcome| = cumulativeSize }  
     184    getter contents() 
     185    (*) ensures { |outcome| = cumulativeSize } 
    186186    = do 
    187187        (* We could do this all with a BIG || of a sequential generator. 
     
    233233      end 
    234234 
    235     add(s: JavaString) = 
     235    add(s: FlatString) = 
    236236      do 
    237237        self.addWholeSubtree(s) 
     
    279279    getter depth() = 0 
    280280    getter isEmpty() = true 
    281     getter asJavaString() = "" 
     281    getter asFlatString() = "" 
    282282    getter asExprString() = "\"\"" 
    283283    getter asDebugString(): String = asDebugStringIndented(0) 
    284      
     284 
    285285    asDebugStringIndented(indent: ZZ32) = spaces(indent) "E" |self| "/" self.depth 
    286      
     286 
    287287    generate⟦R⟧(r: Reduction⟦R⟧, body: Char→R): R = r.empty() 
    288288 
    289289    opr ∈ (c:Char, self): Boolean = false 
    290      
     290 
    291291    rangeContains(r: Range⟦ZZ32⟧, c: Char) = false 
    292292 
     
    309309    end 
    310310 
    311     uncheckedSubstring(r0: Range⟦ZZ32⟧)  
     311    uncheckedSubstring(r0: Range⟦ZZ32⟧) 
    312312    (*) requires { r0.isEmpty } 
    313313    = 
     
    325325 
    326326  end EmptyString 
    327    
     327 
    328328test stringifyChars() = do 
    329329    f:Char = 'f' 
     
    346346    getter depth() = baseString.depth    (* We pretend that substring nodes don't add depth *) 
    347347    getter isEmpty() = false    (* Because we take care never to construct an empty SubString *) 
    348     getter asJavaString() = baseString.asJavaString.uncheckedSubstring(range) 
    349     getter asExprString() = self.asJavaString.asExprString 
     348    getter asFlatString() = baseString.asFlatString.uncheckedSubstring(range) 
     349    getter asExprString() = self.asFlatString.asExprString 
    350350    getter asDebugString(): String = asDebugStringIndented(0) 
    351351    getter isBalanced() = baseString.isBalanced 
    352      
    353     (* this is a placeholder, until I write the better code using split, or  
     352 
     353    (* this is a placeholder, until I write the better code using split, or 
    354354    eliminate SubString entirely *) 
    355     getter generator() : Generator⟦Char⟧ =  
     355    getter generator() : Generator⟦Char⟧ = 
    356356        self.indices.map⟦Char⟧(fn (i:ZZ32):Char => self.get(i)) 
    357      
    358     asDebugStringIndented(indent: ZZ32) : String =  
     357 
     358    asDebugStringIndented(indent: ZZ32) : String = 
    359359        (spaces(indent) ||  "S" |self| "= [" range.asExprString "]") // 
    360360        baseString.asDebugStringIndented(indent + 8) 
    361      
     361 
    362362    opr |self| : ZZ32 = self.size 
    363363 
     
    367367        end 
    368368 
    369     opr CMP(self, other: String)  
    370     (*) ensures { outcome = (self.asJavaString CMP other.asJavaString) }  
     369    opr CMP(self, other: String) 
     370    (*) ensures { outcome = (self.asFlatString CMP other.asFlatString) } 
    371371    = do 
    372372        pieces = baseString.splitWithOffsets() 
     
    374374            BIG LEXICO [(start, str) ← pieces] (do 
    375375                    baseSubrange = (start#|str|) ∩ range 
    376                     baseString.uncheckedSubstring(baseSubrange) CMP  
     376                    baseString.uncheckedSubstring(baseSubrange) CMP 
    377377                        other.uncheckedSubstring((baseSubrange≪range.lower) ∩ other.indices) 
    378378            end) 
     
    391391    end 
    392392 
    393     opr CASE_INSENSITIVE_CMP(self, other: String)  
    394     (*) ensures { outcome = (self.asJavaString CASE_INSENSITIVE_CMP other.asJavaString) }  
     393    opr CASE_INSENSITIVE_CMP(self, other: String) 
     394    (*) ensures { outcome = (self.asFlatString CASE_INSENSITIVE_CMP other.asFlatString) } 
    395395    = do 
    396396        pieces = baseString.splitWithOffsets() 
     
    438438                "SubString ", baseString,  range, " has range greater than that of baseString ", baseString.bounds ) 
    439439        typecase s = baseString of 
    440             CatString ⇒ do  
    441                             deny((s.left.indices ∩ range).isEmpty,  
     440            CatString ⇒ do 
     441                            deny((s.left.indices ∩ range).isEmpty, 
    442442                                        "SubString of CatString not pushed right") 
    443                             deny(((s.right.indices ≫ s.left.size) ∩ range).isEmpty,  
     443                            deny(((s.right.indices ≫ s.left.size) ∩ range).isEmpty, 
    444444                                        "SubString of CatString not pushed left") 
    445445                end 
     
    466466        end 
    467467    end 
    468      
     468 
    469469    split(): Generator⟦String⟧ =self.splitWithOffsets().map(fn (_, str) ⇒str) 
    470470 
     
    475475 
    476476    uncheckedSubstring(r0: Range⟦ZZ32⟧) = do 
    477         assert((r0≫range.lower) ≤ range, true, "asking for substring [",  r0, "] of S", self.size, " = ", self.asJavaString) 
     477        assert((r0≫range.lower) ≤ range, true, "asking for substring [",  r0, "] of S", self.size, " = ", self.asFlatString) 
    478478        if r0.isEmpty then EmptyString 
    479479        elif r0 = self.bounds then self 
     
    504504            var ssize: ZZ32 := 0 
    505505            var sdepth: ZZ32 := 0 
    506              
     506 
    507507        getter asString(): String =do 
    508             a = ("size = " ssize "; depth = " sdepth "; maxFlat = " maxFlat)  
     508            a = ("size = " ssize "; depth = " sdepth "; maxFlat = " maxFlat) 
    509509            b = ("; minFlat = "minFlat "; avFlat = " self.avFlat) 
    510510            c = ("; numFlat = " numFlat) 
    511511            a || b || c 
    512512        end 
    513          
     513 
    514514        getter avFlat(): RR32 =  ssize / (numFlat asif Number) 
    515515 
     
    521521        end 
    522522 
    523         collectStatsFor(s: JavaString) = do 
     523        collectStatsFor(s: FlatString) = do 
    524524            if ssize = 0 then ssize := |s| end 
    525525            if sdepth = 0 then sdepth := s.depth end 
     
    534534            self.collectStatsFor(s.baseString) 
    535535        end 
    536          
     536 
    537537        collectStatsFor(s: EmptyString) = do 
    538538            minFlat := 0 
     
    541541  end StringStats 
    542542 
    543   spaces(nn: ZZ32): String  
    544   (*) ensures { |outcome| = nn}  
     543  spaces(nn: ZZ32): String 
     544  (*) ensures { |outcome| = nn} 
    545545  = do 
    546546      spaceString = "                    " 
     
    553553        else 
    554554            result := result || spaceString 
    555             remainder := remainder - |spaceString|  
     555            remainder := remainder - |spaceString| 
    556556        end 
    557557      end (* do *) 
    558558      result 
    559559  end 
    560    
     560 
    561561  var maxLeafSize: ZZ32 := 32 
    562    
     562 
    563563  newline: String = lineSeparator 
    564564  doubleNewline: String = newline || newline 
  • trunk/Library/Writer.fss

    r3204 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1717 
    1818native component Writer 
    19 import JavaString.JavaString 
     19import FlatString.FlatString 
    2020import Stream.{...} 
    2121export Writer 
     
    2424private package="com.sun.fortress.interpreter.glue.prim" 
    2525 
    26     stdOut: Writer = OutWriter() 
    27     stdErr: Writer = ErrWriter() 
     26stdOut: Writer = OutWriter() 
     27stdErr: Writer = ErrWriter() 
    2828 
    29     private OutWriter(): Writer =  builtinPrimitive( 
    30             "com.sun.fortress.interpreter.glue.prim.Writer$outputWriter") 
    31     private ErrWriter(): Writer = builtinPrimitive( 
    32             "com.sun.fortress.interpreter.glue.prim.Writer$errorWriter") 
     29private OutWriter(): Writer =  builtinPrimitive( 
     30        "com.sun.fortress.interpreter.glue.prim.Writer$outputWriter") 
     31private ErrWriter(): Writer = builtinPrimitive( 
     32        "com.sun.fortress.interpreter.glue.prim.Writer$errorWriter") 
    3333 
    34     object Writer(fileName: String) extends { WriteStream } 
    35         getter asString(): String = "Writer on " self.fileName.asExprString 
    36         getter fileName(): String = 
    37           builtinPrimitive( 
    38             "com.sun.fortress.interpreter.glue.prim.Writer$fileName") 
    39         write(s:JavaString):() = 
    40           builtinPrimitive( 
    41             "com.sun.fortress.interpreter.glue.prim.Writer$write") 
    42         write(c:Char):() = 
    43           builtinPrimitive( 
    44             "com.sun.fortress.interpreter.glue.prim.Writer$write") 
    45         flush():() = 
    46           builtinPrimitive( 
    47             "com.sun.fortress.interpreter.glue.prim.Writer$flush") 
    48         close():() = 
    49           builtinPrimitive( 
    50             "com.sun.fortress.interpreter.glue.prim.Writer$close") 
    51         write(s: String): () = do 
    52             buff = BufferedWriter(self, |s|) 
    53             s.writeOn(buff) 
    54             buff.flush() 
    55         end 
    56     end Writer 
     34object Writer(fileName: String) extends { WriteStream } 
     35    getter asString(): String = "Writer on " self.fileName.asExprString 
     36    getter fileName(): String = 
     37      builtinPrimitive( 
     38        "com.sun.fortress.interpreter.glue.prim.Writer$fileName") 
     39    write(s:FlatString):() = 
     40      builtinPrimitive( 
     41        "com.sun.fortress.interpreter.glue.prim.Writer$write") 
     42    write(c:Char):() = 
     43      builtinPrimitive( 
     44        "com.sun.fortress.interpreter.glue.prim.Writer$write") 
     45    flush():() = 
     46      builtinPrimitive( 
     47        "com.sun.fortress.interpreter.glue.prim.Writer$flush") 
     48    close():() = 
     49      builtinPrimitive( 
     50        "com.sun.fortress.interpreter.glue.prim.Writer$close") 
     51    write(s: String): () = do 
     52        buff = BufferedWriter(self, |s|) 
     53        s.writeOn(buff) 
     54        buff.flush() 
     55    end 
     56end Writer 
    5757 
    58     object BufferedWriter(under: WriteStream, size: ZZ32) extends { WriteStream } 
    59         getter asString(): String = "BufferedWriter on " under.asString 
    60         write(s: String): () = s.writeOn(self) 
    61         write(s: JavaString):() = 
    62           builtinPrimitive( 
    63             "com.sun.fortress.interpreter.glue.prim.BufferedWriter$write") 
    64         write(c: Char):() = 
    65           builtinPrimitive( 
    66             "com.sun.fortress.interpreter.glue.prim.BufferedWriter$write") 
    67         flush():() = 
    68           builtinPrimitive( 
    69             "com.sun.fortress.interpreter.glue.prim.BufferedWriter$flush") 
    70         close():() = 
    71           builtinPrimitive( 
    72             "com.sun.fortress.interpreter.glue.prim.BufferedWriter$close") 
    73     end BufferedWriter 
     58object BufferedWriter(under: WriteStream, size: ZZ32) extends { WriteStream } 
     59    getter asString(): String = "BufferedWriter on " under.asString 
     60    write(s: String): () = s.writeOn(self) 
     61    write(s: FlatString):() = 
     62      builtinPrimitive( 
     63        "com.sun.fortress.interpreter.glue.prim.BufferedWriter$write") 
     64    write(c: Char):() = 
     65      builtinPrimitive( 
     66        "com.sun.fortress.interpreter.glue.prim.BufferedWriter$write") 
     67    flush():() = 
     68      builtinPrimitive( 
     69        "com.sun.fortress.interpreter.glue.prim.BufferedWriter$flush") 
     70    close():() = 
     71      builtinPrimitive( 
     72        "com.sun.fortress.interpreter.glue.prim.BufferedWriter$close") 
     73end BufferedWriter 
    7474 
    7575end 
  • trunk/ProjectFortress/LibraryBuiltin/CompilerBuiltin.fsi

    r3242 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    3939end Object 
    4040 
    41 object JavaString 
    42 end JavaString 
     41object FlatString 
     42end FlatString 
    4343 
    4444end 
  • trunk/ProjectFortress/LibraryBuiltin/CompilerBuiltin.fss

    r3242 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    4444end Object 
    4545 
    46 object JavaString extends String 
    47 end JavaString 
     46object FlatString extends String 
     47end FlatString 
    4848 
    4949end 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/glue/prim/FlatString.java

    r3214 r3287  
    11/******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    3535 
    3636 
    37 public class JavaString extends NativeConstructor { 
     37public class FlatString extends NativeConstructor { 
    3838 
    39     public JavaString(Environment env, 
     39    public FlatString(Environment env, 
    4040                  FTypeObject selfType, 
    4141                  ObjectConstructor def) { 
     
    5151 
    5252    @Override 
    53         protected void unregister() { 
     53    protected void unregister() { 
    5454        FString.resetConstructor(); 
    5555    } 
     
    5858        protected abstract java.lang.String f(java.lang.String s, java.lang.String o); 
    5959        @Override 
    60                 public final FString applyMethod(FObject self, FValue other) { 
     60        public final FString applyMethod(FObject self, FValue other) { 
    6161            return FString.make(f(self.getString(),other.getString())); 
    6262        } 
     
    6666        protected abstract boolean f(java.lang.String s, java.lang.String o); 
    6767        @Override 
    68                 public final FBool applyMethod(FObject self, FValue other) { 
     68        public final FBool applyMethod(FObject self, FValue other) { 
    6969            return FBool.make(f(((FString)self).getString(), 
    7070                                ((FString)other).getString())); 
     
    7575        protected abstract int f(java.lang.String s, java.lang.String o); 
    7676        @Override 
    77                 public final FInt applyMethod(FObject self, FValue other) { 
     77        public final FInt applyMethod(FObject self, FValue other) { 
    7878            return FInt.make(f(((FString)self).getString(), 
    7979                               ((FString)other).getString())); 
     
    8484        protected abstract int f(java.lang.String s); 
    8585        @Override 
    86                 public final FInt applyMethod(FObject self) { 
     86        public final FInt applyMethod(FObject self) { 
    8787            return FInt.make(f(((FString)self).getString())); 
    8888        } 
     
    9292        protected abstract java.lang.String f(java.lang.String s, int lo, int hi); 
    9393        @Override 
    94                 public final FString applyMethod(FObject self, FValue lo, FValue hi) { 
     94        public final FString applyMethod(FObject self, FValue lo, FValue hi) { 
    9595            return FString.make(f(((FString)self).getString(), 
    9696                                  ((FInt)lo).getInt(), 
     
    102102        protected abstract java.lang.String f(FString s); 
    103103        @Override 
    104                 public final FString applyMethod(FObject self) { 
     104        public final FString applyMethod(FObject self) { 
    105105            return FString.make(f((FString) self)); 
    106106        } 
     
    110110        protected abstract char f(java.lang.String s, int i); 
    111111        @Override 
    112                 public final FChar applyMethod(FObject self, FValue i) { 
     112        public final FChar applyMethod(FObject self, FValue i) { 
    113113            return FChar.make(f(((FString)self).getString(), 
    114114                                ((FInt)i).getInt())); 
     
    119119        protected abstract int f(java.lang.String s, int c); 
    120120        @Override 
    121                 public final FInt applyMethod(FObject self, FValue c) { 
     121        public final FInt applyMethod(FObject self, FValue c) { 
    122122            return FInt.make(f(((FString)self).getString(), 
    123123                               ((FChar)c).getChar())); 
     
    127127    public static final class Size extends s2I { 
    128128        @Override 
    129                 protected int f(java.lang.String s) { 
     129        protected int f(java.lang.String s) { 
    130130            return s.length(); 
    131131        } 
     
    134134    public static final class Eq extends ss2B { 
    135135        @Override 
    136                 protected boolean f(java.lang.String self, java.lang.String other) { 
     136        protected boolean f(java.lang.String self, java.lang.String other) { 
    137137            return self.equals(other); 
    138138        } 
     
    141141    public static final class Cmp extends ss2I { 
    142142        @Override 
    143                 protected int f(java.lang.String self, java.lang.String other) { 
     143        protected int f(java.lang.String self, java.lang.String other) { 
    144144            return self.compareTo(other); 
    145145        } 
     
    148148    public static final class CICmp extends ss2I { 
    149149        @Override 
    150                 protected int f(java.lang.String self, java.lang.String other) { 
     150        protected int f(java.lang.String self, java.lang.String other) { 
    151151            return self.compareToIgnoreCase(other); 
    152152        } 
     
    155155    public static final class Substr extends sII2s { 
    156156        @Override 
    157                 protected java.lang.String f(java.lang.String self, int x, int y) { 
     157        protected java.lang.String f(java.lang.String self, int x, int y) { 
    158158            return self.substring(x,y); 
    159159        } 
     
    162162    public static final class ToString extends s2s { 
    163163        @Override 
    164                 protected java.lang.String f(FString self) { 
     164        protected java.lang.String f(FString self) { 
    165165            return self.toString(); 
    166166        } 
     
    169169    public static final class Index extends sI2C { 
    170170        @Override 
    171                 protected char f(java.lang.String self, int i) { 
     171        protected char f(java.lang.String self, int i) { 
    172172            return self.charAt(i); 
    173173        } 
     
    176176    public static final class Concat extends ss2S { 
    177177        @Override 
    178                 protected java.lang.String f(java.lang.String x, java.lang.String y) { 
     178        protected java.lang.String f(java.lang.String x, java.lang.String y) { 
    179179            return x + y; 
    180180        } 
     
    183183    public static final class IndexOf extends sC2I { 
    184184        @Override 
    185                 protected int f(java.lang.String s, int c) { 
     185        protected int f(java.lang.String s, int c) { 
    186186            return s.indexOf((char)c); 
    187187        } 
  • trunk/ProjectFortress/tests/LongStringTests.fss

    r3196 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    2424export Testable 
    2525 
    26     var fileContents: String := "" 
    27     var longSourceString: String := "" 
     26var fileContents: String := "" 
     27var longSourceString: String := "" 
    2828 
    29     test inputTest(): () = do 
    30         readFile(10) 
    31         (* 
    32         println "" 
    33         println "fileContents is a " fileContents.ilkName 
    34         println "length = " fileContents.size 
    35         println "depth = " fileContents.depth 
    36         println  ( if fileContents.isBalanced then 
    37                             "balanced" 
    38                         elif fileContents.isAlmostBalanced then 
    39                             "almost balanced" 
    40                         else 
    41                             "unbalanced" 
    42                         end  ) 
    43          *) 
     29test inputTest(): () = do 
     30    readFile(10) 
     31    (* 
     32    println "" 
     33    println "fileContents is a " fileContents.ilkName 
     34    println "length = " fileContents.size 
     35    println "depth = " fileContents.depth 
     36    println  ( if fileContents.isBalanced then 
     37                        "balanced" 
     38                    elif fileContents.isAlmostBalanced then 
     39                        "almost balanced" 
     40                    else 
     41                        "unbalanced" 
     42                    end  ) 
     43     *) 
    4444 
    45         balancedContents = fileContents.balanced() 
    46         assert(balancedContents, fileContents) 
    47         (* 
    48         println "balancedContents is a " balancedContents.ilkName 
    49         println "length = " balancedContents.size 
    50         println "depth = " balancedContents.depth 
    51         println (  if balancedContents.isBalanced then 
    52                             "balanced" 
    53                         elif balancedContents.isAlmostBalanced then 
    54                             "almost balanced" 
    55                         else 
    56                             "unbalanced" 
    57                         end  ) 
    58         output = FileWriteStream(getEnvironment("fortress.autohome", ".") "/ProjectFortress/tests/poem.out") 
    59         output.write(balancedContents) 
    60         output.close() 
    61         *) 
     45    balancedContents = fileContents.balanced() 
     46    assert(balancedContents, fileContents) 
     47    (* 
     48    println "balancedContents is a " balancedContents.ilkName 
     49    println "length = " balancedContents.size 
     50    println "depth = " balancedContents.depth 
     51    println (  if balancedContents.isBalanced then 
     52                        "balanced" 
     53                    elif balancedContents.isAlmostBalanced then 
     54                        "almost balanced" 
     55                    else 
     56                        "unbalanced" 
     57                    end  ) 
     58    output = FileWriteStream(getEnvironment("fortress.autohome", ".") "/ProjectFortress/tests/poem.out") 
     59    output.write(balancedContents) 
     60    output.close() 
     61    *) 
     62end 
     63 
     64readFile(n: ZZ32): () = do 
     65    input = FileReadStream(getEnvironment("fortress.autohome", ".") "/ProjectFortress/tests/poem.txt") 
     66    maxLeafSize := n 
     67    fileContents := BIG || [ c ← seq(input.chunks(n)) ] c 
     68    input.close() 
     69    longSourceString := fileContents.asFlatString 
     70    (* for i ← seq(1:4) do 
     71        longSourceString := longSourceString || longSourceString 
    6272    end 
     73    longSourceString := longSourceString.asFlatString *) 
     74end 
    6375 
    64     readFile(n: ZZ32): () = do 
    65         input = FileReadStream(getEnvironment("fortress.autohome", ".") "/ProjectFortress/tests/poem.txt") 
    66         maxLeafSize := n 
    67         fileContents := BIG || [ c ← seq(input.chunks(n)) ] c 
    68         input.close() 
    69         longSourceString := fileContents.asJavaString 
    70         (* for i ← seq(1:4) do 
    71             longSourceString := longSourceString || longSourceString 
    72         end 
    73         longSourceString := longSourceString.asJavaString *) 
     76buildString(n: ZZ32): () = do 
     77    if longSourceString.isEmpty then readFile(128) end 
     78    maxLeafSize := n 
     79    fileContents := BIG || [ i ← longSourceString.indices ] longSourceString[i] 
     80end 
     81 
     82test miniTest() = do 
     83    maxLeafSize := 10 
     84    abcdef = CatString("a", CatString("b", CatString("c", CatString("d", 
     85        CatString(EmptyString, CatString("e", "f")))))) 
     86    assert(abcdef, "abcdef") 
     87    balancedAbcdef = abcdef.balanced() 
     88    assert(balancedAbcdef, "abcdef") 
     89    assert(abcdef.asDebugString, "bC6/6:" // 
     90                "        J1/0:a" // 
     91                "        BC5/5:" // 
     92                "                J1/0:b" // 
     93                "                BC4/4:" // 
     94                "                        J1/0:c" // 
     95                "                        BC3/3:" // 
     96                "                                J1/0:d" // 
     97                "                                BC2/2:" // 
     98                "                                        E0/0" // 
     99                "                                        BC2/1:" // 
     100                "                                                J1/0:e" // 
     101                "                                                J1/0:f") 
     102    assert(balancedAbcdef.asDebugString, "J6/0:abcdef") 
     103end 
     104 
     105test statsTest() = do 
     106    buildString(6) 
     107    ss = fileContents.stats() 
     108    println (// ss.asString) 
     109    assert(ss.ssize, fileContents.size) 
     110    assert(ss.maxFlat, 4) 
     111    assert(ss.minFlat, 4) 
     112    assert(ss.avFlat, 4) 
     113    assert(ss.numFlat, 353) 
     114end 
     115 
     116test buildTiming() = do 
     117    println () 
     118    for t ← seq(⟨8, 16, 32, 64 (*, 128, 256, 512, 1024 *)⟩) do 
     119        ("MaxFlat = " || t || ": ") PRINTTIME: buildString(t) 
     120        println(fileContents.stats()) 
    74121    end 
     122end 
    75123 
    76     buildString(n: ZZ32): () = do 
    77         if longSourceString.isEmpty then readFile(128) end 
    78         maxLeafSize := n 
    79         fileContents := BIG || [ i ← longSourceString.indices ] longSourceString[i] 
     124test generatorTest() = do 
     125    "sequential" PRINTTIME: tryGen(⟨7, 9, 17 , 36, 98, 274, 1020, 2030⟩, seq) 
     126    "concurrent" PRINTTIME: tryGen(⟨7, 9, 17 , 36, 98, 274, 1020, 2030⟩, identity⟦Generator⟦Int⟧⟧) 
     127end 
     128 
     129tryGen(endpoints, f) = do 
     130    if fileContents.isEmpty then readFile(29) end 
     131    m = |fileContents| 
     132    println (newline fileContents.stats()) 
     133    for i ← f(endpoints), j ← f(endpoints),  j MOD m ≥ i MOD m do 
     134        (*) println "subrange [" (i MOD m) ":" (j MOD m) "]" 
     135        (*) println fileContents[(i MOD m):(j MOD m)].asDebugString 
     136        assert(BIG || [ ch ←fileContents[(i MOD m):(j MOD m)]] ch, 
     137                fileContents[(i MOD m):(j MOD m)], 
     138                "when comparing subrange [" (i MOD m) ":" (j MOD m) "]") 
    80139    end 
     140end 
    81141 
    82     test miniTest() = do 
    83         maxLeafSize := 10 
    84         abcdef = CatString("a", CatString("b", CatString("c", CatString("d", 
    85             CatString(EmptyString, CatString("e", "f")))))) 
    86         assert(abcdef, "abcdef") 
    87         balancedAbcdef = abcdef.balanced() 
    88         assert(balancedAbcdef, "abcdef") 
    89         assert(abcdef.asDebugString, "bC6/6:" // 
    90                     "        J1/0:a" // 
    91                     "        BC5/5:" // 
    92                     "                J1/0:b" // 
    93                     "                BC4/4:" // 
    94                     "                        J1/0:c" // 
    95                     "                        BC3/3:" // 
    96                     "                                J1/0:d" // 
    97                     "                                BC2/2:" // 
    98                     "                                        E0/0" // 
    99                     "                                        BC2/1:" // 
    100                     "                                                J1/0:e" // 
    101                     "                                                J1/0:f") 
    102         assert(balancedAbcdef.asDebugString, "J6/0:abcdef") 
    103     end 
    104      
    105     test statsTest() = do 
    106         buildString(6) 
    107         ss = fileContents.stats() 
    108         println (// ss.asString) 
    109         assert(ss.ssize, fileContents.size) 
    110         assert(ss.maxFlat, 4) 
    111         assert(ss.minFlat, 4) 
    112         assert(ss.avFlat, 4) 
    113         assert(ss.numFlat, 353) 
    114     end  
    115      
    116     test buildTiming() = do 
    117         println () 
    118         for t ← seq(⟨8, 16, 32, 64 (*, 128, 256, 512, 1024 *)⟩) do 
    119             ("MaxFlat = " || t || ": ") PRINTTIME: buildString(t) 
    120             println(fileContents.stats()) 
    121         end 
    122     end 
    123      
    124     test generatorTest() = do 
    125         "sequential" PRINTTIME: tryGen(⟨7, 9, 17 , 36, 98, 274, 1020, 2030⟩, seq) 
    126         "concurrent" PRINTTIME: tryGen(⟨7, 9, 17 , 36, 98, 274, 1020, 2030⟩, identity⟦Generator⟦Int⟧⟧) 
    127     end 
    128      
    129     tryGen(endpoints, f) = do         
    130         if fileContents.isEmpty then readFile(29) end 
    131         m = |fileContents| 
    132         println (newline fileContents.stats()) 
    133         for i ← f(endpoints), j ← f(endpoints),  j MOD m ≥ i MOD m do 
    134             (*) println "subrange [" (i MOD m) ":" (j MOD m) "]" 
    135             (*) println fileContents[(i MOD m):(j MOD m)].asDebugString 
    136             assert(BIG || [ ch ←fileContents[(i MOD m):(j MOD m)]] ch,  
    137                     fileContents[(i MOD m):(j MOD m)], 
    138                     "when comparing subrange [" (i MOD m) ":" (j MOD m) "]") 
    139         end   
    140     end 
    141  
    142     run(args:String...):() = label runMethod 
    143         readFile(32) 
    144         println fileContents 
    145         miniTest() 
    146         tryGen(⟨7, 9, 17 , 36, 275, 1032⟩, identity⟦Generator⟦Int⟧⟧) 
    147     end runMethod 
     142run(args:String...):() = label runMethod 
     143    readFile(32) 
     144    println fileContents 
     145    miniTest() 
     146    tryGen(⟨7, 9, 17 , 36, 275, 1032⟩, identity⟦Generator⟦Int⟧⟧) 
     147end runMethod 
    148148 
    149149end LongStringTests 
  • trunk/ProjectFortress/tests/StringTests.fss

    r3061 r3287  
    11(******************************************************************************* 
    2     Copyright 2008 Sun Microsystems, Inc., 
     2    Copyright 2009 Sun Microsystems, Inc., 
    33    4150 Network Circle, Santa Clara, California 95054, U.S.A. 
    44    All rights reserved. 
     
    1717 
    1818component StringTests 
    19   import String.{...} 
    20   import JavaString.{...} 
    21   import Set.{...} 
    22   import List.{...} 
    23   export Executable 
    24    
    25   test testDepth(): () = do 
    26     words = ⟨"Hello ", "world, ", "it's ", "a ", "bright ", "new ", "day."⟩ 
    27     var result: String = EmptyString 
    28     for w ← seq(words) do result := CatString(result, w) end 
    29     assert(result, "Hello world, it's a bright new day.") 
    30     result.verify() 
    31     assert(result.depth, 7) 
    32   end   
    33    
    34   test testindexing(): () = do 
    35     words = ⟨"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog."⟩ 
    36     var testString: String = EmptyString 
    37     for w ← seq(words) do testString := CatString(testString, w) end 
    38     referenceString = "Thequickbrownfoxjumpedoverthelazydog." 
    39     assert(testString, referenceString) 
    40     for i ← ⟨ 0, 5, 7, 8, 9, 36, 23, 35 ⟩ do  
    41         assert(testString[i], referenceString[i])  
    42     end 
    43     for i ← ⟨ -1, -5, 37, 38, 109 ⟩ do 
    44         shouldRaise⟦IndexOutOfBounds⟦ZZ32⟧⟧ (fn() => testString[i]) 
    45     end 
    46   end 
    47   
    48  
    49   test testSubString(): () = do 
    50     words = ⟨"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog."⟩ 
    51     var testString: String = EmptyString 
    52     for w ← seq(words) do testString := CatString(testString, w) end 
    53     referenceString = "Thequickbrownfoxjumpedoverthelazydog." 
    54     assert(testString, referenceString) 
    55     for i ← ⟨ 0, 5, 7, 8, 9, 36, 23, 35 ⟩,  
    56             j ← ⟨ 0, 5, 7, 8, 9, 36, 23, 35 ⟩ do  
    57         assert(testString[i:j], referenceString[i:j])  
    58     end 
    59   end 
    60    
    61   test testSubStringSimplification():() = do 
    62     testString = catStringFrom("The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog.") 
    63     testString.verify() 
    64     sub1 = testString[34:36] 
    65     typecase sub1 of 
    66         JavaString => assert(true) 
    67         String => do  
    68                             println sub1.asDebugString 
    69                             fail "sub1=" sub1 " is not a JavaString" 
    70                           end 
    71     end 
    72   end 
    73   
    74     
    75   validatesplitWithOffsets(subject: String, division): () = do 
    76     var len: ZZ32 = 0 
    77     var accum: String = "" 
    78     for (start, str) ← division do 
    79          assert(start, len, str) 
    80          len := len + |str| 
    81          accum := accum || str 
    82     end 
    83       assert(len, |subject|) 
    84       assert(accum, subject) 
    85   end 
    86    
    87   test testIlk() = do 
    88     hello = "Hello" 
    89     assert(hello.ilkName, "JavaString") 
    90     hw = CatString(hello, " World") 
    91     assert(hw.ilkName, "CatString") 
    92   end 
    93    
    94    
    95   test testCatStringGet() = do 
    96     cat = CatString("@ab", "cdef") 
    97     assert(cat.get(1), 'a') 
    98     assert(cat.get(4), 'd') 
    99   end 
    100  
    101   test testSubstringGet() = do 
    102     cat = CatString("@ab", "cdefg") 
    103     subC = cat[2#4] 
    104     assert(subC.ilkName, "SubString", subC, " is not a SubString") 
    105     subC.verify() 
    106     assert(cat[2], 'b') 
    107     assert(subC[0], 'b') 
    108     assert(subC[1], 'c') 
    109     assert(subC[2], 'd') 
    110     assert(subC[3], 'e') 
    111     shouldRaise⟦IndexOutOfBounds⟦ZZ32⟧⟧ (fn() ⇒ subC[4]) 
    112   end 
    113    
    114   test testJavaStringification() = do 
    115     e = EmptyString 
    116     assert(e.asJavaString, "", "EmptyString.javaString") 
    117     c = CatString("abcd", "efgh") 
    118     c.verify 
    119     assert(c.asJavaString, "abcdefgh", "CatString.javaString") 
    120     s = c[2:5] 
    121     s.verify() 
    122     assert(s.asJavaString, "cdef", "SubString.javaString") 
    123     ss = s[1:2] 
    124     ss.verify() 
    125     assert(ss.asJavaString, "de", "Substring of SubString.javaString") 
    126     lss = s[0:1] 
    127     lss.verify() 
    128     assert(lss.asDebugString, "J2/0:cd") 
    129     assert(lss.asJavaString, "cd", "left Substring of SubString.javaString") 
    130   end   
    131    
    132   test testIN() = do 
    133     e = EmptyString 
    134     deny('x' IN e) 
    135     c = CatString("abcd", "efgh") 
    136     assert('a' IN c) 
    137     assert('f' IN c) 
    138     deny('j' IN c) 
    139     s = c[2:5] 
    140     deny('a' IN s) 
    141     assert('d' IN s) 
    142     assert('f' IN s) 
    143     ss = s[1:2] 
    144     assert('e' IN ss) 
    145     assert('d' IN ss) 
    146     deny('f' IN ss) 
    147     lss = s[0:1] 
    148     assert('c' IN lss) 
    149     deny('e' IN lss) 
    150     assert('d' IN lss) 
    151   end 
    152    
    153  
    154   test testsplitWithOffsets():() = do 
    155     subject = CatString("abcd", "efgh") 
    156     substr1 = subject[2:6] 
    157     validatesplitWithOffsets(substr1, seq(substr1.splitWithOffsets())) 
    158      
    159     substr2 = subject[4:6] 
    160     assert(substr2.splitWithOffsets().isEmpty, "subject[4:6].splitWithOffsets is not empty!") 
    161  
    162     substr3 = subject[0:5] 
    163     validatesplitWithOffsets(substr3, seq(substr3.splitWithOffsets())) 
    164      
    165      
    166     subC = (CatString("@ab", "cdefg"))[2#4] 
    167     validatesplitWithOffsets(subC, seq(subC.splitWithOffsets())) 
    168   end  
    169  
    170    
    171   test testComparison():() = do 
    172     smaller = catStringFrom("The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog.") 
    173     bigger = catStringFrom("The", "quick", "brown", "jumped", "fox", "over", "the", "lazy", "doggie.") 
    174     smallerFlat = smaller.asJavaString 
    175     biggerFlat = bigger.asJavaString 
    176     smaller.verify 
    177     bigger.verify 
    178     assert(smaller < bigger) 
    179     assert(smallerFlat < bigger) 
    180     assert(smallerFlat < biggerFlat) 
    181     assert(bigger > smaller) 
    182     assert(smaller[10:] < bigger[10:]) 
    183     assert(bigger[12:] > smaller[12:]) 
    184     assert(biggerFlat[12:] > smaller[12:]) 
    185     a = smaller[30:36]  
    186     b = bigger[30:36] 
    187     a.verify 
    188     b.verify 
    189     assert(smaller[30#6], bigger[30:35], smaller[30#6] " is not = to " bigger[30:35]) 
    190     assert(smallerFlat[30#6], bigger[30:35], smallerFlat[30#6] " is not = to " bigger[30:35]) 
    191   end 
    192    
    193    
    194   test testCIComparison():() = do 
    195     smaller = catStringFrom("The", "quick", "BROWN", "fox", "jumped", "over", "the", "lazy", "dog.") 
    196     bigger = catStringFrom("The", "QUICK", "brown", "JUMPED", "fox", "over", "the", "lazy", "doggie.") 
    197     smallerFlat = smaller.asJavaString 
    198     biggerFlat = bigger.asJavaString 
    199     smaller.verify 
    200     bigger.verify 
    201     assert(smaller CASE_INSENSITIVE_CMP bigger, LessThan) 
    202     assert(smallerFlat CASE_INSENSITIVE_CMP bigger, LessThan) 
    203     assert(smallerFlat CASE_INSENSITIVE_CMP biggerFlat, LessThan) 
    204     assert(bigger CASE_INSENSITIVE_CMP smaller, GreaterThan)  
    205     assert(smaller[10:] CASE_INSENSITIVE_CMP bigger[10:], LessThan) 
    206     assert(bigger[12:] CASE_INSENSITIVE_CMP smaller[12:], GreaterThan) 
    207     assert(biggerFlat[12:] CASE_INSENSITIVE_CMP smaller[12:], GreaterThan) 
    208   end 
    209   
    210   object CatStringReduction extends MonoidReduction[\String\] 
    211     getter asString() = "CatString Reduction" 
    212     empty(): String = EmptyString 
    213     join(a:String, b:String):String = CatString(a, b) 
    214   end 
    215    
    216   catStringFrom(args: String...): String = 
    217     seq(args).generate⟦String⟧(CatStringReduction, fn(x) => x) 
    218      
    219     
    220   test testNonEmptyConcat(): () =  do 
    221     stuff = "Hello " 
    222     more = "World" 
    223     hw = CatString(stuff, more) 
    224     assert(|hw|, |stuff| + |more|) 
    225     assert(hw, "Hello World") 
    226     assert(hw, CatString("Hell", "o World")) 
    227   end 
    228    
    229   test testEmptyConcat(): () = do 
    230     e = EmptyString 
    231     assert(|e|, 0) 
    232     assert(e.isEmpty) 
    233     stuff = "Hello " 
    234     more = "World" 
    235     h = CatString(stuff, e) 
    236     assert(|h|, |stuff|) 
    237     assert(stuff || e, stuff) 
    238   end  
    239  
    240   test testCharConcat(): () =  do 
    241     var result: String = EmptyString 
    242     hw = "Hello World" 
    243     for c <- seq(hw) do 
    244         result := result || c 
    245     end 
    246     assert(result, hw) 
    247   end  
    248    
    249   test testParallelGenerator(): () = do 
    250     chars = "abcdefghijklmnopqrstuvwxyz" 
    251     var result: Set⟦Char⟧ = set⟦Char⟧() 
    252     for c ← chars atomic do result := result.add(c) end 
    253     assert(|result|, |chars|) 
    254     for c ← result do assert(c ∈ chars) end 
    255   end   
    256    
    257   test testSequentialGenerator(): () = do 
    258     chars = "abcdefghijklmnopqrstuvwxyz" 
    259     var result: List⟦Char⟧ = emptyList⟦Char⟧(26) 
    260     for c ← seq(chars) do result := result.addRight(c) end 
    261     assert(|result|, |chars|) 
    262     for i ← result.bounds do assert(result[i] , chars[i]) end 
    263   end   
    264    
    265   test testEquality() = do 
    266     subJ = "bcdefg"[1#4] 
    267     subC = (CatString("@ab", "cdefg"))[2#4] 
    268     assert(subJ > subC, "cdef not > bcde") 
    269     assert("abcdefg"[1#4], subC) 
    270   end 
    271    
    272   test testStringification() = do 
    273     str = CatString("The word \"test\"", " is overused") 
    274     ran = 1:20:2 
    275     assert(str.asString, str) 
    276     assert(str.asExprString, "\"The word \\\"test\\\" is overused\"") 
    277     assert(str.asDebugString, "BC27/1:"// 
    278 "        J15/0:The word \"test\""// 
    279 "        J12/0: is overused")  
    280     assert((CatString(str[#11], str[13:])).asExprString, "\"The word \\\"tt\\\" is overused\"") 
    281     assert(ran.asString, "[1,3,5,7,... 19]") 
    282     assert(ran.asExprString, "1:19:2") 
    283     assert(ran.asDebugString, "StridedFullParScalarRange(1,19,2)") 
    284   end 
    285    
    286   run(args:String...):() = do 
    287     testStringification() 
    288     testDepth() 
    289     testindexing() 
    290     testSubString() 
    291     testSubStringSimplification() 
    292     testIlk() 
    293     testJavaStringification() 
    294     testsplitWithOffsets() 
    295     testIN() 
    296     testComparison() 
    297     testCIComparison() 
    298     testNonEmptyConcat() 
    299     testEmptyConcat() 
    300     testCharConcat() 
    301     testParallelGenerator() 
    302     testSequentialGenerator() 
    303     testCatStringGet() 
    304     testSubstringGet() 
    305     testEquality() 
    306   end 
     19import String.{...} 
     20import FlatString.{...} 
     21import Set.{...} 
     22import List.{...} 
     23export Executable 
     24 
     25test testDepth(): () = do 
     26  words = ⟨"Hello ", "world, ", "it's ", "a ", "bright ", "new ", "day."⟩ 
     27  var result: String = EmptyString 
     28  for w ← seq(words) do result := CatString(result, w) end 
     29  assert(result, "Hello world, it's a bright new day.") 
     30  result.verify() 
     31  assert(result.depth, 7) 
     32end 
     33 
     34test testindexing(): () = do 
     35  words = ⟨"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog."⟩ 
     36  var testString: String = EmptyString 
     37  for w ← seq(words) do testString := CatString(testString, w) end 
     38  referenceString = "Thequickbrownfoxjumpedoverthelazydog." 
     39  assert(testString, referenceString) 
     40  for i ← ⟨ 0, 5, 7, 8, 9, 36, 23, 35 ⟩ do 
     41      assert(testString[i], referenceString[i]) 
     42  end 
     43  for i ← ⟨ -1, -5, 37, 38, 109 ⟩ do 
     44      shouldRaise⟦IndexOutOfBounds⟦ZZ32⟧⟧ (fn() => testString[i]) 
     45  end 
     46end 
     47 
     48 
     49test testSubString(): () = do 
     50  words = ⟨"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog."⟩ 
     51  var testString: String = EmptyString 
     52  for w ← seq(words) do testString := CatString(testString, w) end 
     53  referenceString = "Thequickbrownfoxjumpedoverthelazydog." 
     54  assert(testString, referenceString) 
     55  for i ← ⟨ 0, 5, 7, 8, 9, 36, 23, 35 ⟩, 
     56          j ← ⟨ 0, 5, 7, 8, 9, 36, 23, 35 ⟩ do 
     57      assert(testString[i:j], referenceString[i:j]) 
     58  end 
     59end 
     60 
     61test testSubStringSimplification():() = do 
     62  testString = catStringFrom("The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog.") 
     63  testString.verify() 
     64  sub1 = testString[34:36] 
     65  typecase sub1 of 
     66      FlatString => assert(true) 
     67      String => do 
     68                          println sub1.asDebugString 
     69                          fail "sub1=" sub1 " is not a FlatString" 
     70                        end 
     71  end 
     72end 
     73 
     74 
     75validatesplitWithOffsets(subject: String, division): () = do 
     76  var len: ZZ32 = 0 
     77  var accum: String = "" 
     78  for (start, str) ← division do 
     79       assert(start, len, str) 
     80       len := len + |str| 
     81       accum := accum || str 
     82  end 
     83    assert(len, |subject|) 
     84    assert(accum, subject) 
     85end 
     86 
     87test testIlk() = do 
     88  hello = "Hello" 
     89  assert(hello.ilkName, "FlatString") 
     90  hw = CatString(hello, " World") 
     91  assert(hw.ilkName, "CatString") 
     92end 
     93 
     94 
     95test testCatStringGet() = do 
     96  cat = CatString("@ab", "cdef") 
     97  assert(cat.get(1), 'a') 
     98  assert(cat.get(4), 'd') 
     99end 
     100 
     101test testSubstringGet() = do 
     102  cat = CatString("@ab", "cdefg") 
     103  subC = cat[2#4] 
     104  assert(subC.ilkName, "SubString", subC, " is not a SubString") 
     105  subC.verify() 
     106  assert(cat[2], 'b') 
     107  assert(subC[0], 'b') 
     108  assert(subC[1], 'c') 
     109  assert(subC[2], 'd') 
     110  assert(subC[3], 'e') 
     111  shouldRaise⟦IndexOutOfBounds⟦ZZ32⟧⟧ (fn() ⇒ subC[4]) 
     112end 
     113 
     114test testFlatStringification() = do 
     115  e = EmptyString 
     116  assert(e.asFlatString, "", "EmptyString.javaString") 
     117  c = CatString("abcd", "efgh") 
     118  c.verify 
     119  assert(c.asFlatString, "abcdefgh", "CatString.javaString") 
     120  s = c[2:5] 
     121  s.verify() 
     122  assert(s.asFlatString, "cdef", "SubString.javaString") 
     123  ss = s[1:2] 
     124  ss.verify() 
     125  assert(ss.asFlatString, "de", "Substring of SubString.javaString") 
     126  lss = s[0:1] 
     127  lss.verify() 
     128  assert(lss.asDebugString, "J2/0:cd") 
     129  assert(lss.asFlatString, "cd", "left Substring of SubString.javaString") 
     130end 
     131 
     132test testIN() = do 
     133  e = EmptyString 
     134  deny('x' IN e) 
     135  c = CatString("abcd", "efgh") 
     136  assert('a' IN c) 
     137  assert('f' IN c) 
     138  deny('j' IN c) 
     139  s = c[2:5] 
     140  deny('a' IN s) 
     141  assert('d' IN s) 
     142  assert('f' IN s) 
     143  ss = s[1:2] 
     144  assert('e' IN ss) 
     145  assert('d' IN ss) 
     146  deny('f' IN ss) 
     147  lss = s[0:1] 
     148  assert('c' IN lss) 
     149  deny('e' IN lss) 
     150  assert('d' IN lss) 
     151end 
     152 
     153 
     154test testsplitWithOffsets():() = do 
     155  subject = CatString("abcd", "efgh") 
     156  substr1 = subject[2:6] 
     157  validatesplitWithOffsets(substr1, seq(substr1.splitWithOffsets())) 
     158 
     159  substr2 = subject[4:6] 
     160  assert(substr2.splitWithOffsets().isEmpty, "subject[4:6].splitWithOffsets is not empty!") 
     161 
     162  substr3 = subject[0:5] 
     163  validatesplitWithOffsets(substr3, seq(substr3.splitWithOffsets())) 
     164 
     165 
     166  subC = (CatString("@ab", "cdefg"))[2#4] 
     167  validatesplitWithOffsets(subC, seq(subC.splitWithOffsets())) 
     168end 
     169 
     170 
     171test testComparison():() = do 
     172  smaller = catStringFrom("The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog.") 
     173  bigger = catStringFrom("The", "quick", "brown", "jumped", "fox", "over", "the", "lazy", "doggie.") 
     174  smallerFlat = smaller.asFlatString 
     175  biggerFlat = bigger.asFlatString 
     176  smaller.verify 
     177  bigger.verify 
     178  assert(smaller < bigger) 
     179  assert(smallerFlat < bigger) 
     180  assert(smallerFlat < biggerFlat) 
     181  assert(bigger > smaller) 
     182  assert(smaller[10:] < bigger[10:]) 
     183  assert(bigger[12:] > smaller[12:]) 
     184  assert(biggerFlat[12:] > smaller[12:]) 
     185  a = smaller[30:36] 
     186  b = bigger[30:36] 
     187  a.verify 
     188  b.verify 
     189  assert(smaller[30#6], bigger[30:35], smaller[30#6] " is not = to " bigger[30:35]) 
     190  assert(smallerFlat[30#6], bigger[30:35], smallerFlat[30#6] " is not = to " bigger[30:35]) 
     191end 
     192 
     193 
     194test testCIComparison():() = do 
     195  smaller = catStringFrom("The", "quick", "BROWN", "fox", "jumped", "over", "the", "lazy", "dog.") 
     196  bigger = catStringFrom("The", "QUICK", "brown", "JUMPED", "fox", "over", "the", "lazy", "doggie.") 
     197  smallerFlat = smaller.asFlatString 
     198  biggerFlat = bigger.asFlatString 
     199  smaller.verify 
     200  bigger.verify 
     201  assert(smaller CASE_INSENSITIVE_CMP bigger, LessThan) 
     202  assert(smallerFlat CASE_INSENSITIVE_CMP bigger, LessThan) 
     203  assert(smallerFlat CASE_INSENSITIVE_CMP biggerFlat, LessThan) 
     204  assert(bigger CASE_INSENSITIVE_CMP smaller, GreaterThan) 
     205  assert(smaller[10:] CASE_INSENSITIVE_CMP bigger[10:], LessThan) 
     206  assert(bigger[12:] CASE_INSENSITIVE_CMP smaller[12:], GreaterThan) 
     207  assert(biggerFlat[12:] CASE_INSENSITIVE_CMP smaller[12:], GreaterThan) 
     208end 
     209 
     210object CatStringReduction extends MonoidReduction[\String\] 
     211  getter asString() = "CatString Reduction" 
     212  empty(): String = EmptyString 
     213  join(a:String, b:String):String = CatString(a, b) 
     214end 
     215 
     216catStringFrom(args: String...): String = 
     217  seq(args).generate⟦String⟧(CatStringReduction, fn(x) => x) 
     218 
     219 
     220test testNonEmptyConcat(): () =  do 
     221  stuff = "Hello " 
     222  more = "World" 
     223  hw = CatString(stuff, more) 
     224  assert(|hw|, |stuff| + |more|) 
     225  assert(hw, "Hello World") 
     226  assert(hw, CatString("Hell", "o World")) 
     227end 
     228 
     229test testEmptyConcat(): () = do 
     230  e = EmptyString 
     231  assert(|e|, 0) 
     232  assert(e.isEmpty) 
     233  stuff = "Hello " 
     234  more = "World" 
     235  h = CatString(stuff, e) 
     236  assert(|h|, |stuff|) 
     237  assert(stuff || e, stuff) 
     238end 
     239 
     240test testCharConcat(): () =  do 
     241  var result: String = EmptyString 
     242  hw = "Hello World" 
     243  for c <- seq(hw) do 
     244      result := result || c 
     245  end 
     246  assert(result, hw) 
     247end 
     248 
     249test testParallelGenerator(): () = do 
     250  chars = "abcdefghijklmnopqrstuvwxyz" 
     251  var result: Set⟦Char⟧ = set⟦Char⟧() 
     252  for c ← chars atomic do result := result.add(c) end 
     253  assert(|result|, |chars|) 
     254  for c ← result do assert(c ∈ chars) end 
     255end 
     256 
     257test testSequentialGenerator(): () = do 
     258  chars = "abcdefghijklmnopqrstuvwxyz" 
     259  var result: List⟦Char⟧ = emptyList⟦Char⟧(26) 
     260  for c ← seq(chars) do result := result.addRight(c) end 
     261  assert(|result|, |chars|) 
     262  for i ← result.bounds do assert(result[i] , chars[i]) end 
     263end 
     264 
     265test testEquality() = do 
     266  subJ = "bcdefg"[1#4] 
     267  subC = (CatString("@ab", "cdefg"))[2#4] 
     268  assert(subJ > subC, "cdef not > bcde") 
     269  assert("abcdefg"[1#4], subC) 
     270end 
     271 
     272test testStringification() = do 
     273  str = CatString("The word \"test\"", " is overused") 
     274  ran = 1:20:2 
     275  assert(str.asString, str) 
     276  assert(str.asExprString, "\"The word \\\"test\\\" is overused\"") 
     277  assert(str.asDebugString, "BC27/1:"// 
     278    "        J15/0:The word \"test\""// 
     279    "        J12/0: is overused") 
     280  assert((CatString(str[#11], str[13:])).asExprString, "\"The word \\\"tt\\\" is overused\"") 
     281  assert(ran.asString, "[1,3,5,7,... 19]") 
     282  assert(ran.asExprString, "1:19:2") 
     283  assert(ran.asDebugString, "StridedFullParScalarRange(1,19,2)") 
     284end 
     285 
     286run(args:String...):() = do 
     287  testStringification() 
     288  testDepth() 
     289  testindexing() 
     290  testSubString() 
     291  testSubStringSimplification() 
     292  testIlk() 
     293  testFlatStringification() 
     294  testsplitWithOffsets() 
     295  testIN() 
     296  testComparison() 
     297  testCIComparison() 
     298  testNonEmptyConcat() 
     299  testEmptyConcat() 
     300  testCharConcat() 
     301  testParallelGenerator() 
     302  testSequentialGenerator() 
     303  testCatStringGet() 
     304  testSubstringGet() 
     305  testEquality() 
     306end 
    307307 
    308308end StringTests 
  • trunk/Sandbox/FlatStringIsGenerator.fss

    r2635 r3287  
    1 component JavaStringIsGenerator 
     1component FlatStringIsGenerator 
    22(* 
    3 import JavaString.{...} 
     3import FlatString.{...} 
    44*) 
    55export Executable 
     
    2222(* 
    2323    typecase chs="Hell" of 
    24         JavaString => println "Hell is a JavaString" 
    25         else => println "Hell is NOT a JavaString" 
     24        FlatString => println "Hell is a FlatString" 
     25        else => println "Hell is NOT a FlatString" 
    2626    end 
    2727*)