﻿$engine JScript
$uname testTextWindow
$dname Тесты для класса TextWindow
$addin global
$addin stdcommands
$addin stdlib

stdlib.require('jsUnitCore.js', SelfScript);

var TWW = stdlib.require('TextWindow.js');

var text = "первая строка\nвторая строка\nтретья строка\nчетвертая строка - самая длинная из всех строк\n"
    + "пятая строка покороче, но тоже ничего\nшестая строка\nседьмая строка";

var textDoc = null;
var twnd = null;
    
function setUp()
{
    textDoc = v8New("TextDocument");
    textDoc.SetText(text);

    textDoc.Show();
    
    twnd = TWW.GetTextWindow();
}

function tearDown()
{
    if (twnd)
        delete twnd;
    
    // Чтобы при закрытии не выдавалось сообщение "Записать?", сохраним документ во временный файл.
    var tempFile = globalContext("{4A993AB7-2F75-43CF-B34A-0AD9FFAEE7E3}").GetTempFileName();
    textDoc.Write(tempFile);
    
    // Закроем окно текстового документа.
    stdcommands.Frame.FileClose.send();    
    
    // Удалим временный файл.
    var f = v8New("File", tempFile);
    globalContext("{22A21030-E1D6-46A0-9465-F0A5427BE011}").DeleteFiles(f.Path, f.Name);
}

function macrosTestGetText()
{    
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    
    
    assertEquals("Полученный текст отличается от содержимого текстового окна!", text, twnd.GetText());
    assertEquals("Полученный текст отличается от содержимого текстового окна!", text, twnd.ПолучитьТекст());
}

function macrosTestSetText()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    var testText = "Проверка установки текста\nпрограммно из скрипта";    
    twnd.SetText(testText);
    assertEquals("Установленный и полученный тексты отличаются", testText, textDoc.GetText());
}

function macrosTestRangeGetText()
{
    var r;
    
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    
        
    // Первый символ.
    r = twnd.Range(1, 1, 1, 1);
    assertEquals("(1) Текст не соответствует ожидаемому", 
        "п", r.GetText());

    // Последний символ.
    r = twnd.Range(7, 14, 7, 14);
    assertEquals("(2) Текст не соответствует ожидаемому", 
        "а", r.GetText());
        
    // Первое слово.
    r = twnd.Range(1, 1, 1, 6);
    assertEquals("(3) Текст не соответствует ожидаемому", 
        "первая", r.GetText());

    // Первая строка.
    r = twnd.Range(1,1,1);
    assertEquals("(4) Текст не соответствует ожидаемому", 
        "первая строка", r.GetText());
        
    // Две строки.
    r = twnd.Range(2, 1, 3);
    assertEquals("(5) Текст не соответствует ожидаемому", 
        "вторая строка\nтретья строка", r.GetText());
        
    // Произвольный фрагмент.
    r = twnd.Range(3, 8, 5, 21);
    assertEquals("(6) Текст не соответствует ожидаемому", 
        "строка\nчетвертая строка - самая длинная из всех строк\nпятая строка покороче", r.GetText());

    // Последняя строка.
    r = twnd.Range(7, 1, 7);
    assertEquals("(6) Текст не соответствует ожидаемому", 
        "седьмая строка", r.GetText());
        
}

function macrosTestRangeSetText1()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    // Изменение содержимого одной строки.
    var s1 = "первая строка\nsecond row\nтретья строка\nчетвертая строка - самая длинная из всех строк\n"
        + "пятая строка покороче, но тоже ничего\nшестая строка\nседьмая строка";
        
    var r = twnd.Range(2, 1, 2).SetText("second row");
    assertEquals(s1, textDoc.GetText());
}

function macrosTestRangeSetText2()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    // Изменение содержимого нескольких строк.
    var s2 = "первая строка\nsecond row\nthird row\nfour row\n"
        + "пятая строка покороче, но тоже ничего\nшестая строка\nседьмая строка";
        
    var r = twnd.Range(2, 1, 4).SetText("second row\nthird row\nfour row");
    assertEquals(s2, textDoc.GetText());    
}

function macrosTestRangeSetText3()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    // Изменение произвольного участка текста.
    var s3 = "первая строка\nвторая строка\nтретья строчка теперь будет длиньше любой другой строки\n"
        + "четвертая строка - не самая длинная из всех строк\n"
        + "пятая строка покороче, но тоже ничего\nшестая строка\nседьмая строка";
        
    var r = twnd.Range(3, 12, 4, 18).SetText("чка теперь будет длиньше любой другой строки\nчетвертая строка - не");
    assertEquals(s3, textDoc.GetText());
}

function macrosTestGetLines()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    // Все строки.
    var a1 = ["первая строка", "вторая строка", "третья строка", 
        "четвертая строка - самая длинная из всех строк",
        "пятая строка покороче, но тоже ничего",
        "шестая строка", "седьмая строка"];    
    assertArrayEquals("(1) Массивы строк отличаются.", a1, twnd.GetLines());
       
    // Первая строка.
    var a2 = ["первая строка"];
    assertArrayEquals("(2) Массивы строк отличаются.", a2, twnd.GetLines(1));
    
    // Последняя строка.
    var a3 = ["седьмая строка"];
    assertArrayEquals("(3) Массивы строк отличаются.", a3, twnd.GetLines(7));

    // Диапазон строк.
    // Все строки.
    var a4 = ["четвертая строка - самая длинная из всех строк",
        "пятая строка покороче, но тоже ничего","шестая строка"];    
    assertArrayEquals("(4) Массивы строк отличаются.", a4, twnd.GetLines(4, 6));
    
}

function macrosTestGetLine()
{	
	assertTrue('Нет активного текстового окна!', twnd.IsActive());    
	
	assertEquals("(1) Строка отличается от ожидаемой", "первая строка", twnd.GetLine(1));
	assertEquals("(2) Строка отличается от ожидаемой", "четвертая строка - самая длинная из всех строк", twnd.GetLine(4));
	assertEquals("(3) Строка отличается от ожидаемой", "седьмая строка", twnd.GetLine(7));
}

function macrosTestDeleteLine1()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    // Удаляем первую строку
    twnd.DeleteLine(1);
    var t1 = "вторая строка\nтретья строка\nчетвертая строка - самая длинная из всех строк\n"
    + "пятая строка покороче, но тоже ничего\nшестая строка\nседьмая строка";
    assertEquals(t1, textDoc.GetText());    
}

function macrosTestDeleteLine2()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    // Удаляем последнюю строку
    twnd.DeleteLine(7);
    var t1 = "первая строка\nвторая строка\nтретья строка\nчетвертая строка - самая длинная из всех строк\n"
    + "пятая строка покороче, но тоже ничего\nшестая строка";
    assertEquals("Удаление последней строки сломано: не удаляется конечный перевод строки (\\n)", t1, textDoc.GetText());    
}

function macrosTestDeleteLine3()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    // Удаляем строку из середины текста.
    twnd.DeleteLine(5);
    var t1 = "первая строка\nвторая строка\nтретья строка\nчетвертая строка - самая длинная из всех строк\n"
    + "шестая строка\nседьмая строка";
    assertEquals(t1, textDoc.GetText());    
}

function macrosTestAddLine()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    
    
    var t = "первая строка\nвторая строка\nтретья строка\nчетвертая строка - самая длинная из всех строк\n"
        + "пятая строка покороче, но тоже ничего\nшестая строка\nседьмая строка\nвосьмая строка";
    twnd.AddLine("восьмая строка");
    assertEquals(t, textDoc.GetText());
}

function macrosTestInsertLine1()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    var t = "эта строка должна быть первой\nпервая строка\nвторая строка\nтретья строка\n"
        + "четвертая строка - самая длинная из всех строк\n"
        + "пятая строка покороче, но тоже ничего\nшестая строка\nседьмая строка";

    twnd.InsertLine(1, "эта строка должна быть первой");
    assertEquals(t, textDoc.GetText());
}

function macrosTestInsertLine2()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    var t = "первая строка\nвторая строка\nтретья строка\n"
        + "эта строка теперь будет четвертой\nчетвертая строка - самая длинная из всех строк\n"
        + "пятая строка покороче, но тоже ничего\nшестая строка\nседьмая строка";

    twnd.InsertLine(4, "эта строка теперь будет четвертой");
    assertEquals(t, textDoc.GetText());
}

function macrosTestInsertLine3()
{
    assertTrue('Нет активного текстового окна!', twnd.IsActive());    

    var t = "первая строка\nвторая строка\nтретья строка\n"
        + "четвертая строка - самая длинная из всех строк\n"
        + "пятая строка покороче, но тоже ничего\nшестая строка\nседьмая строка\nэта строка будет последней";

    twnd.InsertLine(8, "эта строка будет последней");
    assertEquals(t, textDoc.GetText());
}

function macrosTestInsertLine4()
{
    var t = "первая строка\nвторая строка\nтретья строка\n"
        + "четвертая строка - самая длинная из всех строк\n"
        + "пятая строка покороче, но тоже ничего\nшестая строка\nэта строка будет предпоследней\nседьмая строка";

    twnd.InsertLine(7, "эта строка будет предпоследней");
    assertEquals(t, textDoc.GetText());
}

function macrosTestClear()
{
    twnd.Clear();
    assertEquals("", textDoc.GetText());
}

//{ Тесты метода GetWordUnderCursor()

/*
первая строка
вторая строка
третья строка
четвертая строка - самая длинная из всех строк
пятая строка покороче, но тоже ничего
шестая строка
седьмая строка";
*/

function macrosTestGetWordUnderCursor1() {
    twnd.SetCaretPos(1, 1);
    assertEquals('первая', twnd.GetWordUnderCursor());
}

function macrosTestGetWordUnderCursor2() {
    twnd.SetCaretPos(1, 10);
    assertEquals('строка', twnd.GetWordUnderCursor());
}

function macrosTestGetWordUnderCursor3() {
    twnd.SetCaretPos(4, 24);
    assertEquals('самая', twnd.GetWordUnderCursor());
}

function macrosTestGetWordUnderCursor5() {
    twnd.SetCaretPos(3, 13);
    assertEquals('строка', twnd.GetWordUnderCursor());
}

function macrosTestGetWordUnderCursor6() {
    twnd.SetCaretPos(7, 14);
    assertEquals('строка', twnd.GetWordUnderCursor());
}

function macrosTestGetWordUnderCursor7() {
    twnd.SetCaretPos(3, 7);
    assertEquals('', twnd.GetWordUnderCursor());
}

function macrosTestGetWordUnderCursor8() {
    twnd.SetCaretPos(4, 19);
    assertEquals('', twnd.GetWordUnderCursor());
}
//}

function macrosTestGetView1() {
    assertNotNull(twnd.GetView());
    assertEquals(twnd.GetHwnd(), twnd.GetView().hwnd);
}

function macrosTestGetView2() {
    twnd._view = undefined;// чтобы гарантированно отработал алгоритм рекурсивного поиска вьюхи
    var view = twnd.GetView();
    assertNotUndefined(view);
    assertNotNull(view);
    assertEquals(twnd.GetHwnd(), view.hwnd);
}
