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_ = &current_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