16ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Copyright 2007-2008 the V8 project authors. All rights reserved. 26ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Redistribution and use in source and binary forms, with or without 36ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// modification, are permitted provided that the following conditions are 46ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// met: 56ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// 66ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// * Redistributions of source code must retain the above copyright 76ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// notice, this list of conditions and the following disclaimer. 86ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// * Redistributions in binary form must reproduce the above 96ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// copyright notice, this list of conditions and the following 106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// disclaimer in the documentation and/or other materials provided 116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// with the distribution. 126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// * Neither the name of Google Inc. nor the names of its 136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// contributors may be used to endorse or promote products derived 146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// from this software without specific prior written permission. 156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// 166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 289dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen#ifdef ENABLE_DEBUGGER_SUPPORT 299dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include <stdlib.h> 316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "v8.h" 336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "liveedit.h" 356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "cctest.h" 366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 386ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockusing namespace v8::internal; 396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Anonymous namespace. 416ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace { 426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 436ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass StringCompareInput : public Comparator::Input { 446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block StringCompareInput(const char* s1, const char* s2) : s1_(s1), s2_(s2) { 466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int GetLength1() { 486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return StrLength(s1_); 496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int GetLength2() { 516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return StrLength(s2_); 526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool Equals(int index1, int index2) { 546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return s1_[index1] == s2_[index2]; 556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block const char* s1_; 596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block const char* s2_; 606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 636ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass DiffChunkStruct : public ZoneObject { 646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DiffChunkStruct(int pos1_param, int pos2_param, 666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int len1_param, int len2_param) 676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block : pos1(pos1_param), pos2(pos2_param), 686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block len1(len1_param), len2(len2_param), next(NULL) {} 696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int pos1; 706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int pos2; 716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int len1; 726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int len2; 736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DiffChunkStruct* next; 746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 776ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass ListDiffOutputWriter : public Comparator::Output { 786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block explicit ListDiffOutputWriter(DiffChunkStruct** next_chunk_pointer) 806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block : next_chunk_pointer_(next_chunk_pointer) { 816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block (*next_chunk_pointer_) = NULL; 826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void AddChunk(int pos1, int pos2, int len1, int len2) { 846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block current_chunk_ = new DiffChunkStruct(pos1, pos2, len1, len2); 856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block (*next_chunk_pointer_) = current_chunk_; 866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block next_chunk_pointer_ = ¤t_chunk_->next; 876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DiffChunkStruct** next_chunk_pointer_; 906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DiffChunkStruct* current_chunk_; 916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 946ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid CompareStringsOneWay(const char* s1, const char* s2, 956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int expected_diff_parameter = -1) { 966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block StringCompareInput input(s1, s2); 976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 98257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); 996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DiffChunkStruct* first_chunk; 1016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ListDiffOutputWriter writer(&first_chunk); 1026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Comparator::CalculateDifference(&input, &writer); 1046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int len1 = StrLength(s1); 1066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int len2 = StrLength(s2); 1076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int pos1 = 0; 1096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int pos2 = 0; 1106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int diff_parameter = 0; 1126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (DiffChunkStruct* chunk = first_chunk; 1146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block chunk != NULL; 1156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block chunk = chunk->next) { 1166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int diff_pos1 = chunk->pos1; 1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int similar_part_length = diff_pos1 - pos1; 1186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int diff_pos2 = pos2 + similar_part_length; 1196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT_EQ(diff_pos2, chunk->pos2); 1216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (int j = 0; j < similar_part_length; j++) { 1236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(pos1 + j < len1); 1246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(pos2 + j < len2); 1256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT_EQ(s1[pos1 + j], s2[pos2 + j]); 1266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block diff_parameter += chunk->len1 + chunk->len2; 1286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block pos1 = diff_pos1 + chunk->len1; 1296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block pos2 = diff_pos2 + chunk->len2; 1306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block { 1326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // After last chunk. 1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int similar_part_length = len1 - pos1; 1346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT_EQ(similar_part_length, len2 - pos2); 1356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block USE(len2); 1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (int j = 0; j < similar_part_length; j++) { 1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(pos1 + j < len1); 1386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(pos2 + j < len2); 1396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT_EQ(s1[pos1 + j], s2[pos2 + j]); 1406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (expected_diff_parameter != -1) { 1446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT_EQ(expected_diff_parameter, diff_parameter); 1456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 1476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1496ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid CompareStrings(const char* s1, const char* s2, 1506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int expected_diff_parameter = -1) { 1516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStringsOneWay(s1, s2, expected_diff_parameter); 1526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStringsOneWay(s2, s1, expected_diff_parameter); 1536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 1546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} // Anonymous namespace. 1566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// --- T h e A c t u a l T e s t s 1596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1606ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockTEST(LiveEditDiffer) { 16144f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::internal::V8::Initialize(NULL); 1626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("zz1zzz12zz123zzz", "zzzzzzzzzz", 6); 1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("zz1zzz12zz123zzz", "zz0zzz0zz0zzz", 9); 1646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("123456789", "987654321", 16); 1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("zzz", "yyy", 6); 1666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("zzz", "zzz12", 2); 1676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("zzz", "21zzz", 2); 1686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("cat", "cut", 2); 1696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("ct", "cut", 1); 1706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("cat", "ct", 1); 1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("cat", "cat", 0); 1726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("", "", 0); 1736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("cat", "", 3); 1746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("a cat", "a capybara", 7); 1756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CompareStrings("abbabababababaaabbabababababbabbbbbbbababa", 1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block "bbbbabababbbabababbbabababababbabbababa"); 1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 1789dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 1799dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen#endif // ENABLE_DEBUGGER_SUPPORT 180