// Copyright (c) 2014, the Dart project authors. All rights reserved.
// Copyright 2012 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
//       copyright notice, this list of conditions and the following
//       disclaimer in the documentation and/or other materials provided
//       with the distribution.
//     * Neither the name of Google Inc. nor the names of its
//       contributors may be used to endorse or promote products derived
//       from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import 'v8_regexp_utils.dart';
import 'package:expect/expect.dart';

void main() {
  // Long string to trigger caching.
  var string =
  """Friends, Romans, countrymen, lend me your ears!  
  I come to bury Caesar, not to praise him.        
  The evil that men do lives after them,           
  The good is oft interred with their bones;       
  So let it be with Caesar. The noble Brutus       
  Hath told you Caesar was ambitious;              
  If it were so, it was a grievous fault,          
  And grievously hath Caesar answer'd it.          
  Here, under leave of Brutus and the rest-        
  For Brutus is an honorable man;                  
  So are they all, all honorable men-              
  Come I to speak in Caesar's funeral.             
  He was my friend, faithful and just to me;       
  But Brutus says he was ambitious,                
  And Brutus is an honorable man.                  
  He hath brought many captives home to Rome,      
  Whose ransoms did the general coffers fill.      
  Did this in Caesar seem ambitious?               
  When that the poor have cried, Caesar hath wept; 
  Ambition should be made of sterner stuff:        
  Yet Brutus says he was ambitious,                
  And Brutus is an honorable man.                  
  You all did see that on the Lupercal             
  I thrice presented him a kingly crown,           
  Which he did thrice refuse. Was this ambition?   
  Yet Brutus says he was ambitious,                
  And sure he is an honorable man.                 
  I speak not to disprove what Brutus spoke,       
  But here I am to speak what I do know.           
  You all did love him once, not without cause;    
  What cause withholds you then to mourn for him?  
  O judgement, thou art fled to brutish beasts,    
  And men have lost their reason. Bear with me;    
  My heart is in the coffin there with Caesar,     
  And I must pause till it come back to me.""";

  var replaced = string.replaceAll(new RegExp(r"\b\w+\b"), "foo");
  for (var i = 0; i < 3; i++) {
    assertEquals(replaced,
                string.replaceAll(new RegExp(r"\b\w+\b"), "foo"));
  }

  // Check that the result is in a COW array.
  var words = string.split(" ");
  assertEquals("Friends,", words[0]);
  words[0] = "Enemies,";
  words = string.split(" ");
  assertEquals("Friends,", words[0]);
}
