I broke up with neovim....vim is my best friend now

This commit is contained in:
LinlyBoi
2023-04-30 08:14:07 +03:00
parent 0d185449c5
commit 4a4a6b1e81
5245 changed files with 468325 additions and 25 deletions

View File

@@ -0,0 +1,56 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest
import test_vimbuffer
import test_libagendafilter
import test_libcheckbox
import test_libbase
import test_libheading
import test_liborgdate
import test_liborgdate_utf8
import test_liborgdate_parsing
import test_liborgdatetime
import test_liborgtimerange
import test_plugin_date
import test_plugin_edit_structure
import test_plugin_edit_checkbox
import test_plugin_misc
import test_plugin_navigator
import test_plugin_show_hide
import test_plugin_tags_properties
import test_plugin_todo
import test_plugin_mappings
if __name__ == '__main__':
tests = unittest.TestSuite()
tests.addTests(test_vimbuffer.suite())
# lib
tests.addTests(test_libbase.suite())
tests.addTests(test_libcheckbox.suite())
tests.addTests(test_libagendafilter.suite())
tests.addTests(test_libheading.suite())
tests.addTests(test_liborgdate.suite())
tests.addTests(test_liborgdate_utf8.suite())
tests.addTests(test_liborgdate_parsing.suite())
tests.addTests(test_liborgdatetime.suite())
tests.addTests(test_liborgtimerange.suite())
# plugins
tests.addTests(test_plugin_date.suite())
tests.addTests(test_plugin_edit_structure.suite())
tests.addTests(test_plugin_edit_checkbox.suite())
tests.addTests(test_plugin_misc.suite())
tests.addTests(test_plugin_navigator.suite())
tests.addTests(test_plugin_show_hide.suite())
tests.addTests(test_plugin_tags_properties.suite())
tests.addTests(test_plugin_todo.suite())
tests.addTests(test_plugin_mappings.suite())
runner = unittest.TextTestRunner()
runner.run(tests)

View File

@@ -0,0 +1,37 @@
* bold, italics and underline syntax matching
** Should match:
*foo* *foo*
*Really, quite long sentence*.
_foo_ _foo_
_really, quite long sentence._.
*Übermensch á* *eä* *ý€*
_Ÿ ï_
*sdf l.*
*sdfsdf ,.*
*foo_ sdf /*
/sdf sdf sdf ./
/google.com/
*[sdf]*
*a* /a/ =b= ~b~ `d`
*abc* /abc/ =bde= ~bde~ `def`
*=*a*=*
** Should not match
http://google.com/
//google.com/
* sdf* _ sdf_
*sdfsdf sdf,*
*foo *
foo_not underlined_bar
*.sdf*[
[*.sdf*
[*sdf*]
*=*a*=

View File

@@ -0,0 +1,168 @@
# -*- coding: utf-8 -*-
import sys
sys.path.append(u'../ftplugin')
import unittest
from datetime import date
from datetime import timedelta
from orgmode.liborgmode.headings import Heading
from orgmode.liborgmode.orgdate import OrgDate
from orgmode.liborgmode.agendafilter import contains_active_todo
from orgmode.liborgmode.agendafilter import contains_active_date
from orgmode.liborgmode.orgdate import OrgDateTime
from orgmode.liborgmode.agendafilter import is_within_week
from orgmode.liborgmode.agendafilter import is_within_week_and_active_todo
from orgmode.liborgmode.agendafilter import filter_items
import vim
from orgmode.py3compat.encode_compatibility import *
counter = 0
class AgendaFilterTestCase(unittest.TestCase):
u"""Tests all the functionality of the Agenda filter module."""
def setUp(self):
global counter
counter += 1
vim.EVALHISTORY = []
vim.EVALRESULTS = {
# no org_todo_keywords for b
u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'),
# global values for org_todo_keywords
u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'),
u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')],
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("b:org_debug")'): u_encode(u'0'),
u_encode(u'exists("*repeat#set()")'): u_encode(u'0'),
u_encode(u'b:changedtick'): u_encode(u'%d' % counter),
u_encode(u"v:count"): u_encode(u'0')
}
vim.current.buffer[:] = [u_encode(i) for i in u"""
* TODO Heading 1
some text
""".split(u'\n')]
def test_contains_active_todo(self):
heading = Heading(title=u'Refactor the code', todo='TODO')
self.assertTrue(contains_active_todo(heading))
heading = Heading(title=u'Refactor the code', todo='DONE')
self.assertFalse(contains_active_todo(heading))
heading = Heading(title=u'Refactor the code', todo=None)
self.assertFalse(contains_active_todo(heading))
def test_contains_active_date(self):
heading = Heading(title=u'Refactor the code', active_date=None)
self.assertFalse(contains_active_date(heading))
odate = OrgDate(True, 2011, 11, 1)
heading = Heading(title=u'Refactor the code', active_date=odate)
self.assertTrue(contains_active_date(heading))
def test_is_within_week_with_orgdate(self):
# to far in the future
tmpdate = date.today() + timedelta(days=8)
odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day)
heading = Heading(title=u'Refactor the code', active_date=odate)
self.assertFalse(is_within_week(heading))
# within a week
tmpdate = date.today() + timedelta(days=5)
odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day)
heading = Heading(title=u'Refactor the code', active_date=odate)
self.assertTrue(is_within_week(heading))
# in the past
tmpdate = date.today() - timedelta(days=105)
odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day)
heading = Heading(title=u'Refactor the code', active_date=odate)
self.assertTrue(is_within_week(heading))
def test_is_within_week_with_orgdatetime(self):
# to far in the future
tmp = date.today() + timedelta(days=1000)
odate = OrgDateTime(True, tmp.year, tmp.month, tmp.day, 10, 10)
heading = Heading(title=u'Refactor the code', active_date=odate)
self.assertFalse(is_within_week(heading))
# within a week
tmpdate = date.today() + timedelta(days=5)
odate = OrgDateTime(True, tmpdate.year, tmpdate.month, tmpdate.day, 1, 0)
heading = Heading(title=u'Refactor the code', active_date=odate)
self.assertTrue(is_within_week(heading))
# in the past
tmpdate = date.today() - timedelta(days=5)
odate = OrgDateTime(True, tmpdate.year, tmpdate.month, tmpdate.day, 1, 0)
heading = Heading(title=u'Refactor the code', active_date=odate)
self.assertTrue(is_within_week(heading))
def test_filter_items(self):
# only headings with date and todo should be returned
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = \
[u_encode(u'TODO'), u_encode(u'STARTED'), u_encode(u'|'), u_encode(u'DONE')]
tmpdate = date.today()
odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day)
tmp_head = Heading(title=u'Refactor the code', todo=u'TODO', active_date=odate)
tmp_head_01 = Heading(title=u'Refactor the code', todo=u'STARTED', active_date=odate)
# TODO add more tests
headings = [tmp_head, tmp_head_01]
filtered = list(filter_items(headings,
[contains_active_date, contains_active_todo]))
self.assertEqual(len(filtered), 2)
self.assertEqual(filtered, headings)
# try a longer list
headings = headings * 3
filtered = list(filter_items(headings,
[contains_active_date, contains_active_todo]))
self.assertEqual(len(filtered), 6)
self.assertEqual(filtered, headings)
# date does not contain all needed fields thus gets ignored
tmpdate = date.today()
odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day)
tmp_head = Heading(title=u'Refactor the code', active_date=odate)
headings = [tmp_head]
filtered = list(filter_items(headings, [contains_active_date,
contains_active_todo]))
self.assertEqual([], filtered)
def test_filter_items_with_some_todos_and_dates(self):
u"""
Only the headings with todo and dates should be returned.
"""
tmp = [u"* TODO OrgMode Demo und Tests"
u"<2011-08-22 Mon>"]
headings = [Heading.parse_heading_from_data(tmp, [u'TODO'])]
filtered = list(filter_items(headings,
[is_within_week_and_active_todo]))
self.assertEqual(len(filtered), 1)
self.assertEqual(headings, filtered)
tmp = [Heading.parse_heading_from_data([u"** DONE something <2011-08-10 Wed>"], [u'TODO']),
Heading.parse_heading_from_data([u"*** TODO rsitenaoritns more <2011-08-25 Thu>"], [u'TODO']),
Heading.parse_heading_from_data([u"*** DONE some more <2011-08-25 Thu>"], [u'TODO']),
Heading.parse_heading_from_data([u"*** TODO some more <2011-08-25 Thu>"], [u'TODO']),
Heading.parse_heading_from_data([u"** DONE something2 <2011-08-10 Wed>"], [u'TODO'])
]
for h in tmp:
headings.append(h)
filtered = list(filter_items(headings,
[is_within_week_and_active_todo]))
self.assertEqual(len(filtered), 3)
self.assertEqual(filtered, [headings[0], headings[2], headings[4]])
def suite():
return unittest.TestLoader().loadTestsFromTestCase(AgendaFilterTestCase)

View File

@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
import unittest
import sys
sys.path.append(u'../ftplugin')
from orgmode.liborgmode.base import Direction, get_domobj_range
from orgmode.liborgmode.headings import Heading
class LibBaseTestCase(unittest.TestCase):
def setUp(self):
self.case1 = """
* head1
heading body
for testing
* head2
** head3
""".split("\n")
def test_base_functions(self):
# direction FORWARD
(start, end) = get_domobj_range(content=self.case1, position=1, identify_fun=Heading.identify_heading)
self.assertEqual((start, end), (1, 3))
(start, end) = get_domobj_range(content=self.case1, position=3, direction=Direction.BACKWARD, \
identify_fun=Heading.identify_heading)
self.assertEqual((start, end), (1, 3))
def suite():
return unittest.TestLoader() \
.loadTestsFromTestCase(
LibBaseTestCase)

View File

@@ -0,0 +1,130 @@
# -*- coding: utf-8 -*-
import unittest
import sys
sys.path.append(u'../ftplugin')
import vim
from orgmode.liborgmode.checkboxes import Checkbox
from orgmode._vim import ORGMODE
from orgmode.py3compat.encode_compatibility import *
def set_vim_buffer(buf=None, cursor=(2, 0), bufnr=0):
if buf is None:
buf = []
vim.current.buffer[:] = buf
vim.current.window.cursor = cursor
vim.current.buffer.number = bufnr
class CheckboxTestCase(unittest.TestCase):
def setUp(self):
counter = 0
vim.CMDHISTORY = []
vim.CMDRESULTS = {}
vim.EVALHISTORY = []
vim.EVALRESULTS = {
# no org_todo_keywords for b
u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'),
# global values for org_todo_keywords
u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'),
u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')],
u_encode(u'exists("g:org_improve_split_heading")'): u_encode(u'0'),
u_encode(u'exists("b:org_improve_split_heading")'): u_encode(u'0'),
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("b:org_debug")'): u_encode(u'0'),
u_encode(u'exists("*repeat#set()")'): u_encode(u'0'),
u_encode(u'b:changedtick'): u_encode(u'%d' % counter),
u_encode(u'&ts'): u_encode(u'8'),
u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'),
u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'),
u_encode(u"v:count"): u_encode(u'0')}
self.c1 = """
* heading1 [/]
- [-] checkbox1 [%]
- [X] checkbox2
- [ ] checkbox3
- [X] checkbox4
""".split("\n")
self.c2 = """
* heading1
- [ ] checkbox1
- [ ] checkbox2
- [ ] checkbox3
- [ ] checkbox4
- [ ] checkbox5
- [ ] checkbox6
""".split("\n")
def test_init(self):
# test initialize Checkbox
c = Checkbox(level=1, title="checkbox1")
self.assertEqual(str(c), " - [ ] checkbox1")
c = Checkbox(level=3, title="checkbox2", status="[X]")
self.assertEqual(str(c), " - [X] checkbox2")
def test_basic(self):
bufnr = 1
set_vim_buffer(buf=self.c1, bufnr=bufnr)
h = ORGMODE.get_document(bufnr=bufnr).current_heading()
h.init_checkboxes()
c = h.current_checkbox(position=2)
self.assertEqual(str(c), self.c1[2])
self.assertFalse(c.are_children_all(Checkbox.STATUS_ON))
self.assertTrue(c.is_child_one(Checkbox.STATUS_OFF))
self.assertFalse(c.are_siblings_all(Checkbox.STATUS_ON))
for child in c.all_children():
pass
for sibling in c.all_siblings():
pass
c = h.current_checkbox(position=3)
new_checkbox = c.copy()
self.assertEqual(str(c), self.c1[3])
c.get_parent_list()
c.get_index_in_parent_list()
def test_identify(self):
# test identify_checkbox
self.assertEqual(Checkbox.identify_checkbox(self.c1[2]), 2)
self.assertEqual(Checkbox.identify_checkbox(self.c1[3]), 8)
# check for corner case
self.assertEqual(Checkbox.identify_checkbox(" - [ ]"), 1)
def test_toggle(self):
bufnr = 2
# test init_checkboxes
set_vim_buffer(buf=self.c1, bufnr=bufnr)
h = ORGMODE.get_document(bufnr=bufnr).current_heading()
h.init_checkboxes()
# toggle checkbox
c = h.current_checkbox(position=4)
c.toggle()
self.assertEqual(str(c), " - [X] checkbox3")
c.toggle()
self.assertEqual(str(c), " - [ ] checkbox3")
(total, on) = c.all_siblings_status()
self.assertEqual((total, on), (2, 1))
def test_subtasks(self):
bufnr = 3
set_vim_buffer(buf=self.c1, bufnr=bufnr)
h = ORGMODE.get_document(bufnr=bufnr).current_heading()
h.init_checkboxes()
c = h.current_checkbox(position=3)
c.toggle()
c = h.current_checkbox(position=2)
(total, on) = c.all_siblings_status()
c.update_subtasks(total=total, on=on)
self.assertEqual(str(c), " - [-] checkbox1 [50%]")
def suite():
return unittest.TestLoader().loadTestsFromTestCase(CheckboxTestCase)

View File

@@ -0,0 +1,154 @@
# -*- coding: utf-8 -*-
import unittest
import sys
sys.path.append(u'../ftplugin')
from orgmode.liborgmode.headings import Heading
from orgmode.liborgmode.orgdate import OrgDate
from orgmode.liborgmode.orgdate import OrgDateTime
class TestHeadingRecognizeDatesInHeading(unittest.TestCase):
def setUp(self):
self.allowed_todo_states = ["TODO"]
tmp = ["* This heading is earlier <2011-08-24 Wed>"]
self.h1 = Heading.parse_heading_from_data(tmp, self.allowed_todo_states)
tmp = ["* This heading is later <2011-08-25 Thu>"]
self.h2 = Heading.parse_heading_from_data(tmp, self.allowed_todo_states)
tmp = ["* This heading is later <2011-08-25 Thu 10:20>"]
self.h2_datetime = Heading.parse_heading_from_data(tmp, self.allowed_todo_states)
tmp = ["* This heading is later <2011-08-26 Fri 10:20>"]
self.h3 = Heading.parse_heading_from_data(tmp, self.allowed_todo_states)
tmp = ["* This heading has no date and should be later than the rest"]
self.h_no_date = Heading.parse_heading_from_data(tmp,
self.allowed_todo_states)
def test_heading_parsing_no_date(self):
"""""
'text' doesn't contain any valid date.
"""
text = ["* TODO This is a test :hallo:"]
h = Heading.parse_heading_from_data(text, self.allowed_todo_states)
self.assertEqual(None, h.active_date)
text = ["* TODO This is a test <2011-08-25>"]
h = Heading.parse_heading_from_data(text, self.allowed_todo_states)
self.assertEqual(None, h.active_date)
text = ["* TODO This is a test <2011-08-25 Wednesday>"]
h = Heading.parse_heading_from_data(text, self.allowed_todo_states)
self.assertEqual(None, h.active_date)
text = ["* TODO This is a test <20110825>"]
h = Heading.parse_heading_from_data(text, self.allowed_todo_states)
self.assertEqual(None, h.active_date)
def test_heading_parsing_with_date(self):
"""""
'text' does contain valid dates.
"""
# orgdate
text = ["* TODO This is a test <2011-08-24 Wed> :hallo:"]
odate = OrgDate(True, 2011, 8, 24)
h = Heading.parse_heading_from_data(text, self.allowed_todo_states)
self.assertEqual(odate, h.active_date)
# orgdatetime
text = ["* TODO This is a test <2011-08-25 Thu 10:10> :hallo:"]
odate = OrgDateTime(True, 2011, 8, 25, 10, 10)
h = Heading.parse_heading_from_data(text, self.allowed_todo_states)
self.assertEqual(odate, h.active_date)
def test_heading_parsing_with_date_and_body(self):
"""""
'text' contains valid dates (in the body).
"""
# orgdatetime
text = ["* TODO This is a test <2011-08-25 Thu 10:10> :hallo:",
"some body text",
"some body text"]
h = Heading.parse_heading_from_data(text, self.allowed_todo_states)
self.assertTrue(isinstance(h.active_date, OrgDateTime))
self.assertEqual("<2011-08-25 Thu 10:10>", str(h.active_date))
text = ["* TODO This is a test :hallo:",
"some body text",
"some body text<2011-08-25 Thu 10:10>"]
h = Heading.parse_heading_from_data(text, self.allowed_todo_states)
self.assertTrue(isinstance(h.active_date, OrgDateTime))
self.assertEqual("<2011-08-25 Thu 10:10>", str(h.active_date))
text = ["* TODO This is a test :hallo:",
"some body text <2011-08-24 Wed>",
"some body text<2011-08-25 Thu 10:10>"]
h = Heading.parse_heading_from_data(text, self.allowed_todo_states)
odate = OrgDate(True, 2011, 8, 24)
self.assertEqual(odate, h.active_date)
def test_less_than_for_dates_in_heading(self):
self.assertTrue(self.h1 < self.h2)
self.assertTrue(self.h1 < self.h3)
self.assertTrue(self.h1 < self.h_no_date)
self.assertTrue(self.h2 < self.h_no_date)
self.assertTrue(self.h2 < self.h3)
self.assertTrue(self.h3 < self.h_no_date)
self.assertFalse(self.h2 < self.h1)
self.assertFalse(self.h3 < self.h2)
def test_less_equal_for_dates_in_heading(self):
self.assertTrue(self.h1 <= self.h2)
self.assertTrue(self.h1 <= self.h_no_date)
self.assertTrue(self.h2 <= self.h_no_date)
self.assertTrue(self.h2 <= self.h2_datetime)
self.assertTrue(self.h2 <= self.h3)
def test_greate_than_for_dates_in_heading(self):
self.assertTrue(self.h2 > self.h1)
self.assertTrue(self.h_no_date > self.h1)
self.assertTrue(self.h_no_date > self.h2)
self.assertFalse(self.h2 > self.h2_datetime)
def test_greate_equal_for_dates_in_heading(self):
self.assertTrue(self.h2 >= self.h1)
self.assertTrue(self.h_no_date >= self.h1)
self.assertTrue(self.h_no_date >= self.h2)
self.assertTrue(self.h2 >= self.h2_datetime)
def test_sorting_of_headings(self):
"""Headings should be sortable."""
self.assertEqual([self.h1, self.h2], sorted([self.h2, self.h1]))
self.assertEqual([self.h1, self.h2_datetime],
sorted([self.h2_datetime, self.h1]))
self.assertEqual([self.h2_datetime, self.h2],
sorted([self.h2_datetime, self.h2]))
self.assertEqual([self.h1, self.h2], sorted([self.h1, self.h2]))
self.assertEqual([self.h1, self.h_no_date],
sorted([self.h1, self.h_no_date]))
self.assertEqual([self.h1, self.h_no_date],
sorted([self.h_no_date, self.h1]))
self.assertEqual([self.h1, self.h2, self.h_no_date],
sorted([self.h2, self.h_no_date, self.h1]))
self.assertEqual(
[self.h1, self.h2_datetime, self.h2, self.h3, self.h_no_date],
sorted([self.h2_datetime, self.h3, self.h2, self.h_no_date, self.h1]))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(
TestHeadingRecognizeDatesInHeading)

View File

@@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
import sys
import unittest
from datetime import date
sys.path.append(u'../ftplugin')
from orgmode.liborgmode.orgdate import OrgDate
from orgmode.py3compat.unicode_compatibility import *
class OrgDateTestCase(unittest.TestCase):
u"""
Tests all the functionality of the OrgDate
"""
def setUp(self):
self.date = date(2011, 8, 29)
self.year = 2011
self.month = 8
self.day = 29
self.text = u'<2011-08-29 Mon>'
self.textinactive = u'[2011-08-29 Mon]'
def test_OrgDate_ctor_active(self):
u"""OrdDate should be created."""
today = date.today()
od = OrgDate(True, today.year, today.month, today.day)
self.assertTrue(isinstance(od, OrgDate))
self.assertTrue(od.active)
def test_OrgDate_ctor_inactive(self):
u"""OrdDate should be created."""
today = date.today()
od = OrgDate(False, today.year, today.month, today.day)
self.assertTrue(isinstance(od, OrgDate))
self.assertFalse(od.active)
def test_OrdDate_str_active(self):
u"""Representation of OrgDates"""
od = OrgDate(True, self.year, self.month, self.day)
self.assertEqual(self.text, unicode(od))
def test_OrdDate_str_inactive(self):
od = OrgDate(False, self.year, self.month, self.day)
self.assertEqual(self.textinactive, unicode(od))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(OrgDateTestCase)

View File

@@ -0,0 +1,246 @@
# -*- coding: utf-8 -*-
import sys
import unittest
sys.path.append(u'../ftplugin')
from orgmode.liborgmode.orgdate import get_orgdate
from orgmode.liborgmode.orgdate import OrgDate
from orgmode.liborgmode.orgdate import OrgDateTime
from orgmode.liborgmode.orgdate import OrgTimeRange
from orgmode.py3compat.unicode_compatibility import *
class OrgDateParsingTestCase(unittest.TestCase):
u"""
Tests the functionality of the parsing function of OrgDate.
Mostly function get_orgdate().
"""
def setUp(self):
self.text = u'<2011-08-29 Mon>'
self.textinactive = u'[2011-08-29 Mon]'
def test_get_orgdate_parsing_active(self):
u"""
get_orgdate should recognize all orgdates in a given text
"""
result = get_orgdate(self.text)
self.assertNotEqual(result, None)
self.assertTrue(isinstance(result, OrgDate))
self.assertTrue(isinstance(get_orgdate(u"<2011-08-30 Tue>"), OrgDate))
self.assertEqual(get_orgdate(u"<2011-08-30 Tue>").year, 2011)
self.assertEqual(get_orgdate(u"<2011-08-30 Tue>").month, 8)
self.assertEqual(get_orgdate(u"<2011-08-30 Tue>").day, 30)
self.assertTrue(get_orgdate(u"<2011-08-30 Tue>").active)
datestr = u"This date <2011-08-30 Tue> is embedded"
self.assertTrue(isinstance(get_orgdate(datestr), OrgDate))
def test_get_orgdatetime_parsing_active(self):
u"""
get_orgdate should recognize all orgdatetimes in a given text
"""
result = get_orgdate(u"<2011-09-12 Mon 10:20>")
self.assertNotEqual(result, None)
self.assertTrue(isinstance(result, OrgDateTime))
self.assertEqual(result.year, 2011)
self.assertEqual(result.month, 9)
self.assertEqual(result.day, 12)
self.assertEqual(result.hour, 10)
self.assertEqual(result.minute, 20)
self.assertTrue(result.active)
result = get_orgdate(u"some datetime <2011-09-12 Mon 10:20> stuff")
self.assertTrue(isinstance(result, OrgDateTime))
def test_get_orgtimerange_parsing_active(self):
u"""
get_orgdate should recognize all orgtimeranges in a given text
"""
daterangestr = u"<2011-09-12 Mon>--<2011-09-13 Tue>"
result = get_orgdate(daterangestr)
self.assertNotEqual(result, None)
self.assertTrue(isinstance(result, OrgTimeRange))
self.assertEqual(unicode(result), daterangestr)
self.assertTrue(result.active)
daterangestr = u"<2011-09-12 Mon 10:20>--<2011-09-13 Tue 13:20>"
result = get_orgdate(daterangestr)
self.assertNotEqual(result, None)
self.assertTrue(isinstance(result, OrgTimeRange))
self.assertEqual(unicode(result), daterangestr)
self.assertTrue(result.active)
daterangestr = u"<2011-09-12 Mon 10:20-13:20>"
result = get_orgdate(daterangestr)
self.assertNotEqual(result, None)
self.assertTrue(isinstance(result, OrgTimeRange))
self.assertEqual(unicode(result), daterangestr)
self.assertTrue(result.active)
def test_get_orgdate_parsing_inactive(self):
u"""
get_orgdate should recognize all inactive orgdates in a given text
"""
result = get_orgdate(self.textinactive)
self.assertNotEqual(result, None)
self.assertTrue(isinstance(result, OrgDate))
self.assertTrue(isinstance(get_orgdate(u"[2011-08-30 Tue]"), OrgDate))
self.assertEqual(get_orgdate(u"[2011-08-30 Tue]").year, 2011)
self.assertEqual(get_orgdate(u"[2011-08-30 Tue]").month, 8)
self.assertEqual(get_orgdate(u"[2011-08-30 Tue]").day, 30)
self.assertFalse(get_orgdate(u"[2011-08-30 Tue]").active)
datestr = u"This date [2011-08-30 Tue] is embedded"
self.assertTrue(isinstance(get_orgdate(datestr), OrgDate))
def test_get_orgdatetime_parsing_passive(self):
u"""
get_orgdate should recognize all orgdatetimes in a given text
"""
result = get_orgdate(u"[2011-09-12 Mon 10:20]")
self.assertNotEqual(result, None)
self.assertTrue(isinstance(result, OrgDateTime))
self.assertEqual(result.year, 2011)
self.assertEqual(result.month, 9)
self.assertEqual(result.day, 12)
self.assertEqual(result.hour, 10)
self.assertEqual(result.minute, 20)
self.assertFalse(result.active)
result = get_orgdate(u"some datetime [2011-09-12 Mon 10:20] stuff")
self.assertTrue(isinstance(result, OrgDateTime))
def test_get_orgdate_parsing_with_list_of_texts(self):
u"""
get_orgdate should return the first date in the list.
"""
datelist = [u"<2011-08-29 Mon>"]
result = get_orgdate(datelist)
self.assertNotEquals(result, None)
self.assertTrue(isinstance(result, OrgDate))
self.assertEqual(result.year, 2011)
self.assertEqual(result.month, 8)
self.assertEqual(result.day, 29)
datelist = [u"<2011-08-29 Mon>",
u"<2012-03-30 Fri>"]
result = get_orgdate(datelist)
self.assertNotEquals(result, None)
self.assertTrue(isinstance(result, OrgDate))
self.assertEqual(result.year, 2011)
self.assertEqual(result.month, 8)
self.assertEqual(result.day, 29)
datelist = [u"some <2011-08-29 Mon>text",
u"<2012-03-30 Fri> is here"]
result = get_orgdate(datelist)
self.assertNotEquals(result, None)
self.assertTrue(isinstance(result, OrgDate))
self.assertEqual(result.year, 2011)
self.assertEqual(result.month, 8)
self.assertEqual(result.day, 29)
datelist = [u"here is no date",
u"some <2011-08-29 Mon>text",
u"<2012-03-30 Fri> is here"]
result = get_orgdate(datelist)
self.assertNotEquals(result, None)
self.assertTrue(isinstance(result, OrgDate))
self.assertEqual(result.year, 2011)
self.assertEqual(result.month, 8)
self.assertEqual(result.day, 29)
datelist = [u"here is no date",
u"some <2011-08-29 Mon 20:10> text",
u"<2012-03-30 Fri> is here"]
result = get_orgdate(datelist)
self.assertNotEquals(result, None)
self.assertTrue(isinstance(result, OrgDateTime))
self.assertEqual(result.year, 2011)
self.assertEqual(result.month, 8)
self.assertEqual(result.day, 29)
self.assertEqual(result.hour, 20)
self.assertEqual(result.minute, 10)
def test_get_orgdate_parsing_with_invalid_input(self):
self.assertEquals(get_orgdate(u"NONSENSE"), None)
self.assertEquals(get_orgdate(u"No D<2011- Date 08-29 Mon>"), None)
self.assertEquals(get_orgdate(u"2011-08-r9 Mon]"), None)
self.assertEquals(get_orgdate(u"<2011-08-29 Mon"), None)
self.assertEquals(get_orgdate(u"<2011-08-29 Mon]"), None)
self.assertEquals(get_orgdate(u"2011-08-29 Mon"), None)
self.assertEquals(get_orgdate(u"2011-08-29"), None)
self.assertEquals(get_orgdate(u"2011-08-29 mon"), None)
self.assertEquals(get_orgdate(u"<2011-08-29 mon>"), None)
self.assertEquals(get_orgdate(u"wrong date embedded <2011-08-29 mon>"), None)
self.assertEquals(get_orgdate(u"wrong date <2011-08-29 mon>embedded "), None)
def test_get_orgdate_parsing_with_invalid_dates(self):
u"""
Something like <2011-14-29 Mon> (invalid dates, they don't exist)
should not be parsed
"""
datestr = u"<2011-14-30 Tue>"
self.assertEqual(get_orgdate(datestr), None)
datestr = u"<2012-03-40 Tue>"
self.assertEqual(get_orgdate(datestr), None)
datestr = u"<2012-03-40 Tue 24:70>"
self.assertEqual(get_orgdate(datestr), None)
def test_get_orgdate_parsing_with_utf8(self):
u"""
get_orgdate should recognize all orgdates within a given utf-8 text
"""
result = get_orgdate(u'<2016-05-07 Sáb>')
self.assertNotEqual(result, None)
self.assertTrue(isinstance(result, OrgDate))
self.assertEqual(result.year, 2016)
self.assertEqual(result.month, 5)
self.assertEqual(result.day, 7)
self.assertTrue(result.active)
datestr = u"This date <2016-05-07 Sáb> is embedded"
self.assertTrue(isinstance(get_orgdate(datestr), OrgDate))
result = get_orgdate(u'[2016-05-07 Sáb]')
self.assertFalse(result.active)
datestr = u"This date [2016-05-07 Sáb] is embedded"
self.assertTrue(isinstance(get_orgdate(datestr), OrgDate))
def test_get_orgdatetime_parsing_with_utf8(self):
u"""
get_orgdate should recognize all orgdatetimes in a given utf-8 text
"""
result = get_orgdate(u"<2016-05-07 Sáb 10:20>")
self.assertNotEqual(result, None)
self.assertTrue(isinstance(result, OrgDateTime))
self.assertEqual(result.year, 2016)
self.assertEqual(result.month, 5)
self.assertEqual(result.day, 7)
self.assertEqual(result.hour, 10)
self.assertEqual(result.minute, 20)
self.assertTrue(result.active)
result = get_orgdate(u"some datetime <2016-05-07 Sáb 10:20> stuff")
self.assertTrue(isinstance(result, OrgDateTime))
result = get_orgdate(u"[2016-05-07 Sáb 10:20]")
self.assertFalse(result.active)
result = get_orgdate(u"some datetime [2016-05-07 Sáb 10:20] stuff")
self.assertTrue(isinstance(result, OrgDateTime))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(OrgDateParsingTestCase)

View File

@@ -0,0 +1,50 @@
# -*- coding: utf-8 -*-
import sys
import unittest
import locale
import threading
from datetime import date
from contextlib import contextmanager
from orgmode.py3compat.unicode_compatibility import *
sys.path.append(u'../ftplugin')
from orgmode.liborgmode.orgdate import OrgDate
class OrgDateUtf8TestCase(unittest.TestCase):
u"""
Tests OrgDate with utf-8 enabled locales
"""
LOCALE_LOCK = threading.Lock()
UTF8_LOCALE = "fr_FR.utf-8"
@contextmanager
def setlocale(self, name):
with self.LOCALE_LOCK:
saved = locale.setlocale(locale.LC_ALL)
try:
yield locale.setlocale(locale.LC_ALL, name)
finally:
locale.setlocale(locale.LC_ALL, saved)
def setUp(self):
self.year = 2016
self.month = 5
self.day = 7
self.text = u'<2016-05-07 sam.>'
self.textinactive = u'[2016-05-07 sam.]'
def test_OrdDate_str_unicode_active(self):
with self.setlocale(self.UTF8_LOCALE):
od = OrgDate(True, self.year, self.month, self.day)
self.assertEqual(self.text, unicode(od))
def test_OrdDate_str_unicode_inactive(self):
with self.setlocale(self.UTF8_LOCALE):
od = OrgDate(False, self.year, self.month, self.day)
self.assertEqual(self.textinactive, unicode(od))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(OrgDateUtf8TestCase)

View File

@@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
import sys
import unittest
from datetime import datetime
sys.path.append(u'../ftplugin')
from orgmode.liborgmode.orgdate import OrgDateTime
from orgmode.py3compat.unicode_compatibility import *
class OrgDateTimeTestCase(unittest.TestCase):
u"""
Tests all the functionality of the OrgDateTime
"""
def test_OrgDateTime_ctor_active(self):
u"""OrdDateTime should be created."""
today = datetime.today()
odt = OrgDateTime(True, today.year, today.month, today.day, today.hour,
today.minute)
self.assertTrue(isinstance(odt, OrgDateTime))
self.assertTrue(odt.active)
def test_OrgDateTime_ctor_inactive(self):
u"""OrdDateTime should be created."""
today = datetime.today()
odt = OrgDateTime(False, today.year, today.month, today.day, today.hour,
today.minute)
self.assertTrue(isinstance(odt, OrgDateTime))
self.assertFalse(odt.active)
def test_OrdDateTime_str_active(self):
u"""Representation of OrgDateTime"""
t = 2011, 9, 8, 10, 20
odt = OrgDateTime(False, t[0], t[1], t[2], t[3], t[4])
self.assertEqual(u"[2011-09-08 Thu 10:20]", unicode(odt))
def test_OrdDateTime_str_inactive(self):
u"""Representation of OrgDateTime"""
t = 2011, 9, 8, 10, 20
odt = OrgDateTime(True, t[0], t[1], t[2], t[3], t[4])
self.assertEqual(u"<2011-09-08 Thu 10:20>", unicode(odt))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(OrgDateTimeTestCase)

View File

@@ -0,0 +1,83 @@
# -*- coding: utf-8 -*-
import sys
import unittest
from datetime import date
from datetime import datetime
sys.path.append(u'../ftplugin')
from orgmode.liborgmode.orgdate import OrgTimeRange
class OrgTimeRangeTestCase(unittest.TestCase):
def setUp(self):
self.date = date(2011, 8, 29)
self.year = 2011
self.month = 8
self.day = 29
self.text = '<2011-08-29 Mon>'
self.textinactive = '[2011-08-29 Mon]'
def test_OrgTimeRange_ctor_active(self):
u"""
timerange should be created.
"""
start = date(2011, 9 , 12)
end = date(2011, 9 , 13)
timerange = OrgTimeRange(True, start, end)
self.assertTrue(isinstance(timerange, OrgTimeRange))
self.assertTrue(timerange.active)
def test_OrgTimeRange_ctor_inactive(self):
u"""
timerange should be created.
"""
start = date(2011, 9 , 12)
end = date(2011, 9 , 13)
timerange = OrgTimeRange(False, start, end)
self.assertTrue(isinstance(timerange, OrgTimeRange))
self.assertFalse(timerange.active)
def test_OrdDate_str_active(self):
u"""Representation of OrgDates"""
start = date(2011, 9 , 12)
end = date(2011, 9 , 13)
timerange = OrgTimeRange(True, start, end)
expected = "<2011-09-12 Mon>--<2011-09-13 Tue>"
self.assertEqual(str(timerange), expected)
start = datetime(2011, 9 , 12, 20, 00)
end = datetime(2011, 9 , 13, 21, 59)
timerange = OrgTimeRange(True, start, end)
expected = "<2011-09-12 Mon 20:00>--<2011-09-13 Tue 21:59>"
self.assertEqual(str(timerange), expected)
start = datetime(2011, 9 , 12, 20, 00)
end = datetime(2011, 9 , 12, 21, 00)
timerange = OrgTimeRange(True, start, end)
expected = "<2011-09-12 Mon 20:00-21:00>"
self.assertEqual(str(timerange), expected)
def test_OrdDate_str_inactive(self):
u"""Representation of OrgDates"""
start = date(2011, 9 , 12)
end = date(2011, 9 , 13)
timerange = OrgTimeRange(False, start, end)
expected = "[2011-09-12 Mon]--[2011-09-13 Tue]"
self.assertEqual(str(timerange), expected)
start = datetime(2011, 9 , 12, 20, 00)
end = datetime(2011, 9 , 13, 21, 59)
timerange = OrgTimeRange(False, start, end)
expected = "[2011-09-12 Mon 20:00]--[2011-09-13 Tue 21:59]"
self.assertEqual(str(timerange), expected)
start = datetime(2011, 9 , 12, 20, 00)
end = datetime(2011, 9 , 12, 21, 00)
timerange = OrgTimeRange(False, start, end)
expected = "[2011-09-12 Mon 20:00-21:00]"
self.assertEqual(str(timerange), expected)
def suite():
return unittest.TestLoader().loadTestsFromTestCase(OrgTimeRangeTestCase)

View File

@@ -0,0 +1,172 @@
# -*- coding: utf-8 -*-
from __future__ import print_function
import unittest
import sys
sys.path.append(u'../ftplugin')
from datetime import date
from datetime import datetime
from orgmode.plugins.Date import Date
class DateTestCase(unittest.TestCase):
u"""Tests all the functionality of the Date plugin.
Also see:
http://orgmode.org/manual/The-date_002ftime-prompt.html#The-date_002ftime-prompt
"""
def setUp(self):
self.d = date(2011, 5, 22)
def test_modify_time_with_None(self):
# no modification should happen
res = Date._modify_time(self.d, None)
self.assertEquals(self.d, res)
def test_modify_time_with_dot(self):
# no modification should happen
res = Date._modify_time(self.d, u'.')
self.assertEquals(self.d, res)
def test_modify_time_with_given_relative_days(self):
# modifier and expected result
test_data = [(u'+0d', self.d),
(u'+1d', date(2011, 5, 23)),
(u'+2d', date(2011, 5, 24)),
(u'+7d', date(2011, 5, 29)),
(u'+9d', date(2011, 5, 31)),
(u'+10d', date(2011, 6, 1)),
(u'7d', self.d)] # wrong format: plus is missing
for modifier, expected in test_data:
self.assertEquals(expected, Date._modify_time(self.d, modifier))
def test_modify_time_with_given_relative_days_without_d(self):
# modifier and expected result
test_data = [(u'+0', self.d),
(u'+1', date(2011, 5, 23)),
(u'+2', date(2011, 5, 24)),
(u'+7', date(2011, 5, 29)),
(u'+9', date(2011, 5, 31)),
(u'+10', date(2011, 6, 1))]
for modifier, expected in test_data:
result = Date._modify_time(self.d, modifier)
self.assertEquals(expected, result)
def test_modify_time_with_given_relative_weeks(self):
# modifier and expected result
test_data = [(u'+1w', date(2011, 5, 29)),
(u'+2w', date(2011, 6, 5)),
(u'+3w', date(2011, 6, 12)),
(u'+3w', date(2011, 6, 12)),
(u'+0w', self.d),
(u'3w', self.d), # wrong format
(u'+w', self.d)] # wrong format
for modifier, expected in test_data:
self.assertEquals(expected, Date._modify_time(self.d, modifier))
def test_modify_time_with_given_relative_months(self):
test_data = [(u'+0m', self.d),
(u'+1m', date(2011, 6, 22)),
(u'+2m', date(2011, 7, 22))]
for modifier, expected in test_data:
self.assertEquals(expected, Date._modify_time(self.d, modifier))
def test_modify_time_with_given_relative_years(self):
test_data = [(u'+1y', date(2012, 5, 22)),
(u'+10y', date(2021, 5, 22)),
(u'+0y', self.d)]
for modifier, expected in test_data:
self.assertEquals(expected, Date._modify_time(self.d, modifier))
def test_modify_time_with_given_weekday(self):
# use custom day instead of self.d to ease testing
cust_day = date(2011, 5, 25) # it's a Wednesday
#print(cust_day.weekday()) # 2
test_data = [(u'Thu', date(2011, 5, 26)),
(u'thu', date(2011, 5, 26)),
(u'tHU', date(2011, 5, 26)),
(u'THU', date(2011, 5, 26)),
(u'Fri', date(2011, 5, 27)),
(u'sat', date(2011, 5, 28)),
(u'sun', date(2011, 5, 29)),
(u'mon', date(2011, 5, 30)),
(u'tue', date(2011, 5, 31)),
(u'wed', date(2011, 6, 1))]
for modifier, expected in test_data:
self.assertEquals(expected, Date._modify_time(cust_day, modifier))
def test_modify_time_with_month_and_day(self):
cust_date = date(2006, 6, 13)
test_data = [(u'sep 15', date(2006, 9, 15)),
(u'Sep 15', date(2006, 9, 15)),
(u'SEP 15', date(2006, 9, 15)),
(u'feb 15', date(2007, 2, 15)),
(u'jan 1', date(2007, 1, 1)),
(u'7/5', date(2006, 7, 5)),
(u'2/5', date(2007, 2, 5)),]
for modifier, expected in test_data:
self.assertEquals(expected, Date._modify_time(cust_date, modifier))
def test_modify_time_with_time(self):
cust_date = date(2006, 6, 13)
test_data = [(u'12:45', datetime(2006, 6, 13, 12, 45)),
(u'1:45', datetime(2006, 6, 13, 1, 45)),
(u'1:05', datetime(2006, 6, 13, 1, 5)),]
for modifier, expected in test_data:
res = Date._modify_time(cust_date, modifier)
self.assertTrue(isinstance(res, datetime))
self.assertEquals(expected, res)
def test_modify_time_with_full_dates(self):
result = Date._modify_time(self.d, u'2011-01-12')
expected = date(2011, 1, 12)
self.assertEquals(expected, result)
reults = Date._modify_time(self.d, u'2015-03-12')
expected = date(2015, 3, 12)
self.assertEquals(expected, reults)
cust_date = date(2006, 6, 13)
test_data = [(u'3-2-5', date(2003, 2, 5)),
(u'12-2-28', date(2012, 2, 28)),
(u'2/5/3', date(2003, 2, 5)),
(u'sep 12 9', date(2009, 9, 12)),
(u'jan 2 99', date(2099, 1, 2)),]
for modifier, expected in test_data:
self.assertEquals(expected, Date._modify_time(cust_date, modifier))
def test_modify_time_with_only_days(self):
cust_date = date(2006, 6, 13)
test_data = [(u'14', date(2006, 6, 14)),
(u'12', date(2006, 7, 12)),
(u'1', date(2006, 7, 1)),
(u'29', date(2006, 6, 29)),]
for modifier, expected in test_data:
self.assertEquals(expected, Date._modify_time(cust_date, modifier))
def test_modify_time_with_day_and_time(self):
cust_date = date(2006, 6, 13)
test_data = [(u'+1 10:20', datetime(2006, 6, 14, 10, 20)),
(u'+1w 10:20', datetime(2006, 6, 20, 10, 20)),
(u'+2 10:30', datetime(2006, 6, 15, 10, 30)),
(u'+2d 10:30', datetime(2006, 6, 15, 10, 30))]
for modifier, expected in test_data:
result = Date._modify_time(cust_date, modifier)
self.assertEquals(expected, result)
def suite():
return unittest.TestLoader().loadTestsFromTestCase(DateTestCase)

View File

@@ -0,0 +1,239 @@
# -*- coding: utf-8 -*-
import unittest
import sys
sys.path.append(u'../ftplugin')
import vim
from orgmode._vim import ORGMODE
from orgmode.py3compat.encode_compatibility import *
PLUGIN_NAME = u'EditCheckbox'
bufnr = 10
def set_vim_buffer(buf=None, cursor=(2, 0), bufnr=0):
if buf is None:
buf = []
vim.current.buffer[:] = buf
vim.current.window.cursor = cursor
vim.current.buffer.number = bufnr
counter = 0
class EditCheckboxTestCase(unittest.TestCase):
def setUp(self):
if PLUGIN_NAME not in ORGMODE.plugins:
ORGMODE.register_plugin(PLUGIN_NAME)
self.editcheckbox = ORGMODE.plugins[PLUGIN_NAME]
vim.EVALRESULTS = {
# no org_todo_keywords for b
u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'),
# global values for org_todo_keywords
u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'),
u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')],
u_encode(u'exists("g:org_improve_split_heading")'): u_encode(u'0'),
u_encode(u'exists("b:org_improve_split_heading")'): u_encode(u'0'),
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("b:org_debug")'): u_encode(u'0'),
u_encode(u'exists("*repeat#set()")'): u_encode(u'0'),
u_encode(u'b:changedtick'): u_encode(u'%d' % counter),
u_encode(u'&ts'): u_encode(u'8'),
u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'),
u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'),
u_encode(u"v:count"): u_encode(u'0'),
# jump to insert mode after adding heading/checkbox
u_encode(u'exists("g:org_prefer_insert_mode")'): u_encode(u'0'),
u_encode(u'exists("b:org_prefer_insert_mode")'): u_encode(u'0')}
self.c1 = u"""
* heading1 [%]
- [ ] checkbox1 [/]
- [ ] checkbox2
- [ ] checkbox3
- [ ] checkbox4
- [ ] checkbox5
- [ ] checkbox6
- [ ] checkbox7
- [ ] checkbox8
""".split(u'\n')
self.c2 = u"""
* a checkbox list [%]
- checkbox [0%]
- [ ] test1
- [ ] test2
- [ ] test3
""".split(u'\n')
self.c3 = u"""
* heading
1. [ ] another main task [%]
- [ ] sub task 1
- [ ] sub task 2
2. [ ] another main task
""".split(u'\n')
self.c4 = u"""
* heading
""".split(u'\n')
self.c5 = u"""
* heading1
1. item
9. item
}. item
a. item
z. item
A. item
Z. item
aa. item
""".split("\n")
def test_toggle(self):
global bufnr
bufnr += 1
# test on self.c1
set_vim_buffer(buf=self.c1, cursor=(6, 0), bufnr=bufnr)
# update_checkboxes_status
self.editcheckbox.update_checkboxes_status()
self.assertEqual(vim.current.buffer[1], u"* heading1 [0%]")
# toggle
self.editcheckbox.toggle()
self.assertEqual(vim.current.buffer[5], u" - [X] checkbox4")
bufnr += 1
set_vim_buffer(buf=self.c1, cursor=(9, 0), bufnr=bufnr)
# toggle and check checkbox status
self.editcheckbox.toggle()
self.assertEqual(vim.current.buffer[8], u" - [X] checkbox7")
self.assertEqual(vim.current.buffer[7], u" - [-] checkbox6")
self.assertEqual(vim.current.buffer[6], u" - [-] checkbox5")
# new_checkbox
bufnr += 1
set_vim_buffer(buf=self.c1, cursor=(9, 0), bufnr=bufnr)
vim.current.window.cursor = (9, 0)
self.assertEqual(vim.current.buffer[9], u' - [ ] checkbox8')
self.editcheckbox.new_checkbox(below=True)
# vim's buffer behave just opposite to Python's list when inserting a
# new item. The new entry is appended in vim put prepended in Python!
self.assertEqual(vim.current.buffer[10], u' - [ ] checkbox8')
self.assertEqual(vim.current.buffer[9], u' - [ ] ')
self.editcheckbox.update_checkboxes_status()
def test_no_status_checkbox(self):
global bufnr
bufnr += 1
# test on self.c2
set_vim_buffer(buf=self.c2, bufnr=bufnr)
self.assertEqual(vim.current.buffer[2], u" - checkbox [0%]")
# toggle
vim.current.window.cursor = (4, 0)
self.editcheckbox.toggle()
self.assertEqual(vim.current.buffer[3], u" - [X] test1")
# self.editcheckbox.update_checkboxes_status()
# see if the no status checkbox update its status
self.assertEqual(vim.current.buffer[2], u" - checkbox [33%]")
def test_number_list(self):
global bufnr
bufnr += 1
set_vim_buffer(buf=self.c3, bufnr=bufnr)
vim.current.window.cursor = (6, 0)
self.editcheckbox.toggle()
self.assertEqual(vim.current.buffer[5], u" 2. [X] another main task")
def test_new_checkbox(self):
global bufnr
bufnr += 1
set_vim_buffer(buf=self.c4, bufnr=bufnr)
vim.current.window.cursor = (2, 1)
self.editcheckbox.new_checkbox(below=True)
self.assertEqual(vim.current.buffer[2], u" - [ ] ")
def test_item_decrement(self):
global bufnr
bufnr += 1
set_vim_buffer(buf=self.c5, bufnr=bufnr)
vim.current.window.cursor = (3, 1)
self.editcheckbox.new_checkbox(below=False, plain=True)
self.assertEqual(vim.current.buffer[2], u" 0. ")
self.assertEqual(vim.current.buffer[3], u" 1. item")
vim.current.window.cursor = (3, 1)
self.editcheckbox.new_checkbox(below=False, plain=True)
self.assertEqual(vim.current.buffer[1], u"* heading1")
self.assertEqual(vim.current.buffer[2], u" 0. ")
self.assertEqual(vim.current.buffer[3], u" 1. item")
vim.current.window.cursor = (5, 1)
self.editcheckbox.new_checkbox(below=False, plain=True)
self.assertEqual(vim.current.buffer[4], u" 8. ")
self.assertEqual(vim.current.buffer[5], u" 9. item")
vim.current.window.cursor = (8, 1)
self.editcheckbox.new_checkbox(below=False, plain=True)
# no further decrement than a
self.assertEqual(vim.current.buffer[6], u" }. item")
self.assertEqual(vim.current.buffer[7], u" a. item")
self.assertEqual(vim.current.buffer[8], u" z. item")
def test_item_decrementA(self):
global bufnr
bufnr += 1
set_vim_buffer(buf=self.c5, bufnr=bufnr)
vim.current.window.cursor = (8, 1)
self.editcheckbox.new_checkbox(below=False, plain=True)
# decrement from A to z
self.assertEqual(vim.current.buffer[7], u" z. ")
self.assertEqual(vim.current.buffer[8], u" A. item")
def test_item_increment(self):
global bufnr
bufnr += 1
set_vim_buffer(buf=self.c5, bufnr=bufnr)
vim.current.window.cursor = (3, 1)
self.editcheckbox.new_checkbox(below=True, plain=True)
self.assertEqual(vim.current.buffer[2], u" 1. item")
self.assertEqual(vim.current.buffer[3], u" 2. ")
vim.current.window.cursor = (5, 1)
self.editcheckbox.new_checkbox(below=True, plain=True)
self.assertEqual(vim.current.buffer[4], u" 9. item")
self.assertEqual(vim.current.buffer[5], u" }. item")
self.assertEqual(vim.current.buffer[6], u" 10. ")
def test_item_incrementz(self):
global bufnr
bufnr += 1
set_vim_buffer(buf=self.c5, bufnr=bufnr)
vim.current.window.cursor = (6, 1)
self.editcheckbox.new_checkbox(below=True, plain=True)
self.assertEqual(vim.current.buffer[5], u" a. item")
self.assertEqual(vim.current.buffer[6], u" b. ")
vim.current.window.cursor = (8, 1)
self.editcheckbox.new_checkbox(below=True, plain=True)
self.assertEqual(vim.current.buffer[7], u" z. item")
self.assertEqual(vim.current.buffer[8], u" A. ")
vim.current.window.cursor = (11, 1)
self.editcheckbox.new_checkbox(below=True, plain=True)
self.assertEqual(vim.current.buffer[10], u" Z. item")
self.assertEqual(vim.current.buffer[11], u" aa. item")
self.assertEqual(vim.current.buffer[12], u"")
vim.current.window.cursor = (12, 1)
self.editcheckbox.new_checkbox(below=True, plain=True)
self.assertEqual(vim.current.buffer[11], u" aa. item")
self.assertEqual(vim.current.buffer[12], u"")
def suite():
return unittest.TestLoader().loadTestsFromTestCase(EditCheckboxTestCase)

View File

@@ -0,0 +1,387 @@
# -*- coding: utf-8 -*-
import unittest
import sys
sys.path.append(u'../ftplugin')
import vim
from orgmode._vim import ORGMODE
from orgmode.py3compat.encode_compatibility import *
counter = 0
class EditStructureTestCase(unittest.TestCase):
def setUp(self):
global counter
counter += 1
vim.CMDHISTORY = []
vim.CMDRESULTS = {}
vim.EVALHISTORY = []
vim.EVALRESULTS = {
# no org_todo_keywords for b
u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'),
# global values for org_todo_keywords
u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'),
u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')],
u_encode(u'exists("g:org_improve_split_heading")'): u_encode(u'0'),
u_encode(u'exists("b:org_improve_split_heading")'): u_encode(u'0'),
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("b:org_debug")'): u_encode(u'0'),
u_encode(u'exists("*repeat#set()")'): u_encode(u'0'),
u_encode(u'b:changedtick'): u_encode(u'%d' % counter),
u_encode(u'&ts'): u_encode(u'8'),
u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'),
u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'),
u_encode(u"v:count"): u_encode(u'0'),
# jump to insert mode after adding heading/checkbox
u_encode(u'exists("g:org_prefer_insert_mode")'): u_encode(u'0'),
u_encode(u'exists("b:org_prefer_insert_mode")'): u_encode(u'0')}
if not u'EditStructure' in ORGMODE.plugins:
ORGMODE.register_plugin(u'EditStructure')
self.editstructure = ORGMODE.plugins[u'EditStructure']
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 1
Text 1
Bla bla
** Überschrift 1.1
Text 2
Bla Bla bla
** Überschrift 1.2
Text 3
**** Überschrift 1.2.1.falsch
Bla Bla bla bla
*** Überschrift 1.2.1
* Überschrift 2
* Überschrift 3
asdf sdf
""".split(u'\n')]
def test_new_heading_below_normal_behavior(self):
vim.current.window.cursor = (1, 0)
self.assertNotEqual(self.editstructure.new_heading(below=True), None)
self.assertEqual(vim.current.buffer[0], u_encode(u'* '))
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
def test_new_heading_above_normal_behavior(self):
vim.current.window.cursor = (1, 1)
self.assertNotEqual(self.editstructure.new_heading(below=False), None)
self.assertEqual(vim.current.buffer[0], u_encode(u'* '))
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
def test_new_heading_below(self):
vim.current.window.cursor = (2, 0)
vim.current.buffer[5] = u_encode(u'** Überschrift 1.1 :Tag:')
self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=False), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 6gg"|startinsert!'))
self.assertEqual(vim.current.buffer[4], u_encode(u'Bla bla'))
self.assertEqual(vim.current.buffer[5], u_encode(u'* '))
self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1 :Tag:'))
self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2'))
def test_new_heading_below_insert_mode(self):
vim.current.window.cursor = (2, 1)
self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 3gg"|startinsert!'))
self.assertEqual(vim.current.buffer[2], u_encode(u'* Überschrift 1'))
self.assertEqual(vim.current.buffer[5], u_encode(u'Bla bla'))
self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2'))
def test_new_heading_below_split_text_at_the_end(self):
vim.current.buffer[1] = u_encode(u'* Überschriftx1')
vim.current.window.cursor = (2, 14)
self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 3gg"|startinsert!'))
self.assertEqual(vim.current.buffer[2], u_encode(u'* '))
self.assertEqual(vim.current.buffer[5], u_encode(u'Bla bla'))
self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2'))
def test_new_heading_below_split_text_at_the_end_insert_parts(self):
vim.current.window.cursor = (2, 14)
self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 3gg"|startinsert!'))
self.assertEqual(vim.current.buffer[2], u_encode(u'* 1'))
self.assertEqual(vim.current.buffer[5], u_encode(u'Bla bla'))
self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2'))
def test_new_heading_below_in_the_middle(self):
vim.current.window.cursor = (10, 0)
self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 13gg"|startinsert!'))
self.assertEqual(vim.current.buffer[11], u_encode(u''))
self.assertEqual(vim.current.buffer[12], u_encode(u'** '))
self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch'))
def test_new_heading_below_in_the_middle2(self):
vim.current.window.cursor = (13, 0)
self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 16gg"|startinsert!'))
self.assertEqual(vim.current.buffer[14], u_encode(u'Bla Bla bla bla'))
self.assertEqual(vim.current.buffer[15], u_encode(u'**** '))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1'))
def test_new_heading_below_in_the_middle3(self):
vim.current.window.cursor = (16, 0)
self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 17gg"|startinsert!'))
self.assertEqual(vim.current.buffer[15], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** '))
self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2'))
def test_new_heading_below_at_the_end(self):
vim.current.window.cursor = (18, 0)
self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 21gg"|startinsert!'))
self.assertEqual(vim.current.buffer[19], u_encode(u''))
self.assertEqual(vim.current.buffer[20], u_encode(u'* '))
self.assertEqual(len(vim.current.buffer), 21)
def test_new_heading_above(self):
vim.current.window.cursor = (2, 0)
self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 2gg"|startinsert!'))
self.assertEqual(vim.current.buffer[0], u_encode(u''))
self.assertEqual(vim.current.buffer[1], u_encode(u'* '))
self.assertEqual(vim.current.buffer[2], u_encode(u'* Überschrift 1'))
def test_new_heading_above_in_the_middle(self):
vim.current.window.cursor = (10, 0)
self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 10gg"|startinsert!'))
self.assertEqual(vim.current.buffer[8], u_encode(u'Bla Bla bla'))
self.assertEqual(vim.current.buffer[9], u_encode(u'** '))
self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2'))
def test_new_heading_above_in_the_middle2(self):
vim.current.window.cursor = (13, 0)
self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 13gg"|startinsert!'))
self.assertEqual(vim.current.buffer[11], u_encode(u''))
self.assertEqual(vim.current.buffer[12], u_encode(u'**** '))
self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch'))
def test_new_heading_above_in_the_middle3(self):
vim.current.window.cursor = (16, 0)
self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 16gg"|startinsert!'))
self.assertEqual(vim.current.buffer[14], u_encode(u'Bla Bla bla bla'))
self.assertEqual(vim.current.buffer[15], u_encode(u'*** '))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1'))
def test_new_heading_above_at_the_end(self):
vim.current.window.cursor = (18, 0)
self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 18gg"|startinsert!'))
self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2'))
self.assertEqual(vim.current.buffer[17], u_encode(u'* '))
self.assertEqual(vim.current.buffer[18], u_encode(u'* Überschrift 3'))
def test_new_heading_below_split_heading_title(self):
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 1 :Tag:
Text 1
Bla bla
** Überschrift 1.1
Text 2
Bla Bla bla
** Überschrift 1.2
Text 3
**** Überschrift 1.2.1.falsch
Bla Bla bla bla
*** Überschrift 1.2.1
* Überschrift 2
* Überschrift 3
asdf sdf
""".split(u'\n')]
vim.current.window.cursor = (2, 6)
self.assertNotEqual(self.editstructure.new_heading(insert_mode=True), None)
self.assertEqual(vim.current.buffer[0], u_encode(u''))
self.assertEqual(vim.current.buffer[1], u_encode(u'* Über :Tag:'))
self.assertEqual(vim.current.buffer[2], u_encode(u'* schrift 1'))
self.assertEqual(vim.current.buffer[3], u_encode(u'Text 1'))
def test_new_heading_below_split_heading_title_with_todo(self):
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* TODO Überschrift 1 :Tag:
Text 1
Bla bla
** Überschrift 1.1
Text 2
Bla Bla bla
** Überschrift 1.2
Text 3
**** Überschrift 1.2.1.falsch
Bla Bla bla bla
*** Überschrift 1.2.1
* Überschrift 2
* Überschrift 3
asdf sdf
""".split(u'\n')]
vim.current.window.cursor = (2, 5)
self.assertNotEqual(self.editstructure.new_heading(insert_mode=True), None)
self.assertEqual(vim.current.buffer[0], u_encode(u''))
self.assertEqual(vim.current.buffer[1], u_encode(u'* TODO :Tag:'))
self.assertEqual(vim.current.buffer[2], u_encode(u'* Überschrift 1'))
self.assertEqual(vim.current.buffer[3], u_encode(u'Text 1'))
def test_demote_heading(self):
vim.current.window.cursor = (13, 0)
self.assertNotEqual(self.editstructure.demote_heading(), None)
self.assertEqual(vim.current.buffer[10], u_encode(u'Text 3'))
self.assertEqual(vim.current.buffer[11], u_encode(u''))
self.assertEqual(vim.current.buffer[12], u_encode(u'***** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[13], u_encode(u''))
# actually the indentation comes through vim, just the heading is updated
self.assertEqual(vim.current.buffer[14], u_encode(u'Bla Bla bla bla'))
self.assertEqual(vim.current.buffer[15], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.window.cursor, (13, 1))
def test_demote_newly_created_level_one_heading(self):
vim.current.window.cursor = (2, 0)
self.assertNotEqual(self.editstructure.new_heading(below=True), None)
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
self.assertEqual(vim.current.buffer[5], u_encode(u'* '))
self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2'))
vim.current.window.cursor = (6, 2)
self.assertNotEqual(self.editstructure.demote_heading(), None)
self.assertEqual(vim.current.buffer[5], u_encode(u'** '))
self.assertEqual(vim.current.buffer[6], u_encode(u'*** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[10], u_encode(u'*** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[13], u_encode(u'***** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[16], u_encode(u'**** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2'))
def test_demote_newly_created_level_two_heading(self):
vim.current.window.cursor = (10, 0)
self.assertNotEqual(self.editstructure.new_heading(below=True), None)
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
self.assertEqual(vim.current.buffer[5], u_encode(u'** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[9], u_encode(u'** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[12], u_encode(u'** '))
self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2'))
vim.current.window.cursor = (13, 3)
self.assertNotEqual(self.editstructure.demote_heading(including_children=False, on_heading=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 13gg"|startinsert!'))
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
self.assertEqual(vim.current.buffer[5], u_encode(u'** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[9], u_encode(u'** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[12], u_encode(u'*** '))
self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2'))
def test_demote_last_heading(self):
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 2
* Überschrift 3""".split('\n')]
vim.current.window.cursor = (3, 0)
h = ORGMODE.get_document().current_heading()
self.assertNotEqual(self.editstructure.demote_heading(), None)
self.assertEqual(h.end, 2)
self.assertFalse(vim.CMDHISTORY)
self.assertEqual(vim.current.buffer[2], u_encode(u'** Überschrift 3'))
self.assertEqual(vim.current.window.cursor, (3, 1))
def test_promote_heading(self):
vim.current.window.cursor = (13, 0)
self.assertNotEqual(self.editstructure.promote_heading(), None)
self.assertEqual(vim.current.buffer[10], u_encode(u'Text 3'))
self.assertEqual(vim.current.buffer[11], u_encode(u''))
self.assertEqual(vim.current.buffer[12], u_encode(u'*** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[13], u_encode(u''))
# actually the indentation comes through vim, just the heading is updated
self.assertEqual(vim.current.buffer[14], u_encode(u'Bla Bla bla bla'))
self.assertEqual(vim.current.buffer[15], u_encode(u'*** Überschrift 1.2.1'))
self.assertEqual(vim.current.window.cursor, (13, -1))
def test_promote_level_one_heading(self):
vim.current.window.cursor = (2, 0)
self.assertEqual(self.editstructure.promote_heading(), None)
self.assertEqual(len(vim.CMDHISTORY), 0)
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_demote_parent_heading(self):
vim.current.window.cursor = (2, 0)
self.assertNotEqual(self.editstructure.demote_heading(), None)
self.assertEqual(vim.current.buffer[1], u_encode(u'** Überschrift 1'))
self.assertEqual(vim.current.buffer[5], u_encode(u'*** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[9], u_encode(u'*** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[12], u_encode(u'***** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[15], u_encode(u'**** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2'))
self.assertEqual(vim.current.window.cursor, (2, 1))
def test_promote_parent_heading(self):
vim.current.window.cursor = (10, 0)
self.assertNotEqual(self.editstructure.promote_heading(), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal 10ggV16gg='))
self.assertEqual(vim.current.buffer[5], u_encode(u'** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[9], u_encode(u'* Überschrift 1.2'))
self.assertEqual(vim.current.buffer[12], u_encode(u'*** Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[15], u_encode(u'** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2'))
self.assertEqual(vim.current.window.cursor, (10, -1))
# run tests with count
def test_demote_parent_heading_count(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u"v:count"] = u_encode(u'3')
self.assertNotEqual(self.editstructure.demote_heading(), None)
self.assertEqual(vim.current.buffer[1], u_encode(u'**** Überschrift 1'))
self.assertEqual(vim.current.buffer[5], u_encode(u'***** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[9], u_encode(u'***** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[12], u_encode(u'******* Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[15], u_encode(u'****** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2'))
self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2'))
self.assertEqual(vim.current.window.cursor, (2, 3))
def test_promote_parent_heading(self):
vim.current.window.cursor = (13, 0)
vim.EVALRESULTS[u"v:count"] = u_encode(u'3')
self.assertNotEqual(self.editstructure.promote_heading(), None)
self.assertEqual(vim.current.buffer[5], u_encode(u'** Überschrift 1.1'))
self.assertEqual(vim.current.buffer[9], u_encode(u'** Überschrift 1.2'))
self.assertEqual(vim.current.buffer[12], u_encode(u'* Überschrift 1.2.1.falsch'))
self.assertEqual(vim.current.buffer[15], u_encode(u'** Überschrift 1.2.1'))
self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2'))
self.assertEqual(vim.current.window.cursor, (13, -3))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(EditStructureTestCase)

View File

@@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
sys.path.append(u'../ftplugin')
import unittest
import orgmode.settings
from orgmode.exceptions import PluginError
from orgmode._vim import ORGMODE
from orgmode.keybinding import MODE_ALL, Plug
import vim
from orgmode.py3compat.encode_compatibility import *
ORG_PLUGINS = ['ShowHide', '|', 'Navigator', 'EditStructure', '|', 'Hyperlinks', '|', 'Todo', 'TagsProperties', 'Date', 'Agenda', 'Misc', '|', 'Export']
class MappingTestCase(unittest.TestCase):
u"""Tests all plugins for overlapping mappings."""
def test_non_overlapping_plug_mappings(self):
def find_overlapping_mappings(kb, all_keybindings):
found_overlapping_mapping = False
for tkb in all_keybindings:
if kb.mode == tkb.mode or MODE_ALL in (kb.mode, tkb.mode):
if isinstance(kb._action, Plug) and isinstance(tkb._action, Plug):
akb = kb.action
atkb = tkb.action
if (akb.startswith(atkb) or atkb.startswith(akb)) and akb != atkb:
print(u'\nERROR: Found overlapping mapping: %s (%s), %s (%s)' % (kb.key, akb, tkb.key, atkb))
found_overlapping_mapping = True
if all_keybindings:
res = find_overlapping_mappings(all_keybindings[0], all_keybindings[1:])
if not found_overlapping_mapping:
return res
return found_overlapping_mapping
if self.keybindings:
self.assertFalse(find_overlapping_mappings(self.keybindings[0], self.keybindings[1:]))
def setUp(self):
self.keybindings = []
vim.EVALRESULTS = {
u'exists("g:org_debug")': 0,
u'exists("b:org_debug")': 0,
u'exists("*repeat#set()")': 0,
u'b:changedtick': 0,
u_encode(u'exists("b:org_plugins")'): 0,
u_encode(u'exists("g:org_plugins")'): 1,
u_encode(u'g:org_plugins'): ORG_PLUGINS,
}
for plugin in filter(lambda p: p != '|', ORG_PLUGINS):
try:
ORGMODE.register_plugin(plugin)
except PluginError:
pass
if plugin in ORGMODE._plugins:
self.keybindings.extend(ORGMODE._plugins[plugin].keybindings)
def suite():
return unittest.TestLoader().loadTestsFromTestCase(MappingTestCase)

View File

@@ -0,0 +1,164 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest
import sys
sys.path.append(u'../ftplugin')
import vim
from orgmode._vim import indent_orgmode, fold_orgmode, ORGMODE
from orgmode.py3compat.encode_compatibility import *
ORGMODE.debug = True
START = True
END = False
counter = 0
class MiscTestCase(unittest.TestCase):
def setUp(self):
global counter
counter += 1
vim.CMDHISTORY = []
vim.CMDRESULTS = {}
vim.EVALHISTORY = []
vim.EVALRESULTS = {
# no org_todo_keywords for b
u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'),
# global values for org_todo_keywords
u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'),
u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')],
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("*repeat#set()")'): u_encode(u'0'),
u_encode(u"v:count"): u_encode(u'0'),
u_encode(u'b:changedtick'): u_encode(u'%d' % counter),
u_encode(u"v:lnum"): u_encode(u'0')}
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 1
Text 1
Bla bla
** Überschrift 1.1
Text 2
Bla Bla bla
** Überschrift 1.2
Text 3
**** Überschrift 1.2.1.falsch
Bla Bla bla bla
*** Überschrift 1.2.1
* Überschrift 2
* Überschrift 3
asdf sdf
""".split(u'\n') ]
def test_indent_noheading(self):
# test first heading
vim.current.window.cursor = (1, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'1')
indent_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 0)
def test_indent_heading(self):
# test first heading
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'2')
indent_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 0)
def test_indent_heading_middle(self):
# test first heading
vim.current.window.cursor = (3, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'3')
indent_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:indent_level = 2'))
def test_indent_heading_middle2(self):
# test first heading
vim.current.window.cursor = (4, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'4')
indent_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:indent_level = 2'))
def test_indent_heading_end(self):
# test first heading
vim.current.window.cursor = (5, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'5')
indent_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:indent_level = 2'))
def test_fold_heading_start(self):
# test first heading
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'2')
fold_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = ">1"'))
def test_fold_heading_middle(self):
# test first heading
vim.current.window.cursor = (3, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'3')
fold_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = 1'))
def test_fold_heading_end(self):
# test first heading
vim.current.window.cursor = (5, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'5')
fold_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = 1'))
def test_fold_heading_end_of_last_child(self):
# test first heading
vim.current.window.cursor = (16, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'16')
fold_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
# which is also end of the parent heading <1
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = ">3"'))
def test_fold_heading_end_of_last_child_next_heading(self):
# test first heading
vim.current.window.cursor = (17, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'17')
fold_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = ">1"'))
def test_fold_middle_subheading(self):
# test first heading
vim.current.window.cursor = (13, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'13')
fold_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = ">4"'))
def test_fold_middle_subheading2(self):
# test first heading
vim.current.window.cursor = (14, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'14')
fold_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = 4'))
def test_fold_middle_subheading3(self):
# test first heading
vim.current.window.cursor = (15, 0)
vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'15')
fold_orgmode()
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = 4'))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(MiscTestCase)

View File

@@ -0,0 +1,633 @@
# -*- coding: utf-8 -*-
import unittest
import sys
sys.path.append(u'../ftplugin')
import vim
from orgmode._vim import ORGMODE
from orgmode.py3compat.encode_compatibility import *
START = True
END = False
def set_visual_selection(visualmode, line_start, line_end, col_start=1,
col_end=1, cursor_pos=START):
if visualmode not in (u'', u'V', u'v'):
raise ValueError(u'Illegal value for visualmode, must be in , V, v')
vim.EVALRESULTS['visualmode()'] = visualmode
# getpos results [bufnum, lnum, col, off]
vim.EVALRESULTS['getpos("\'<")'] = ('', '%d' % line_start, '%d' %
col_start, '')
vim.EVALRESULTS['getpos("\'>")'] = ('', '%d' % line_end, '%d' %
col_end, '')
if cursor_pos == START:
vim.current.window.cursor = (line_start, col_start)
else:
vim.current.window.cursor = (line_end, col_end)
counter = 0
class NavigatorTestCase(unittest.TestCase):
def setUp(self):
global counter
counter += 1
vim.CMDHISTORY = []
vim.CMDRESULTS = {}
vim.EVALHISTORY = []
vim.EVALRESULTS = {
# no org_todo_keywords for b
u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'),
# global values for org_todo_keywords
u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'),
u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')],
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("*repeat#set()")'): u_encode(u'0'),
u_encode(u'b:changedtick'): u_encode(u'%d' % counter),
u_encode(u"v:count"): u_encode(u'0'),
}
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 1
Text 1
Bla bla
** Überschrift 1.1
Text 2
Bla Bla bla
** Überschrift 1.2
Text 3
**** Überschrift 1.2.1.falsch
Bla Bla bla bla
*** Überschrift 1.2.1
* Überschrift 2
* Überschrift 3
asdf sdf
""".split(u'\n') ]
if not u'Navigator' in ORGMODE.plugins:
ORGMODE.register_plugin(u'Navigator')
self.navigator = ORGMODE.plugins[u'Navigator']
def test_movement(self):
# test movement outside any heading
vim.current.window.cursor = (1, 0)
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (1, 0))
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (2, 2))
def test_forward_movement(self):
# test forward movement
vim.current.window.cursor = (2, 0)
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (6, 3))
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (10, 3))
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (13, 5))
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (16, 4))
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (17, 2))
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (18, 2))
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (18, 2))
## don't move cursor if last heading is already focussed
vim.current.window.cursor = (19, 6)
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (19, 6))
## test movement with count
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'-1')
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (6, 3))
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'0')
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (6, 3))
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'1')
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (6, 3))
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'3')
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (16, 4))
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (18, 2))
self.navigator.next(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (18, 2))
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'0')
def test_backward_movement(self):
# test backward movement
vim.current.window.cursor = (19, 6)
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (18, 2))
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (17, 2))
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (16, 4))
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (13, 5))
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (10, 3))
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (6, 3))
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (2, 2))
## test movement with count
vim.current.window.cursor = (19, 6)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'-1')
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (18, 2))
vim.current.window.cursor = (19, 6)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'0')
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (18, 2))
vim.current.window.cursor = (19, 6)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'3')
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (16, 4))
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'4')
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (2, 2))
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'4')
self.navigator.previous(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (2, 2))
def test_parent_movement(self):
# test movement to parent
vim.current.window.cursor = (2, 0)
self.assertEqual(self.navigator.parent(mode=u'normal'), None)
self.assertEqual(vim.current.window.cursor, (2, 0))
vim.current.window.cursor = (3, 4)
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (3, 4))
vim.current.window.cursor = (16, 4)
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (10, 3))
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (2, 2))
vim.current.window.cursor = (15, 6)
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (10, 3))
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (2, 2))
## test movement with count
vim.current.window.cursor = (16, 4)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'-1')
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (10, 3))
vim.current.window.cursor = (16, 4)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'0')
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (10, 3))
vim.current.window.cursor = (16, 4)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'1')
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (10, 3))
vim.current.window.cursor = (16, 4)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'2')
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (2, 2))
vim.current.window.cursor = (16, 4)
vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'3')
self.navigator.parent(mode=u'normal')
self.assertEqual(vim.current.window.cursor, (2, 2))
def test_next_parent_movement(self):
# test movement to parent
vim.current.window.cursor = (6, 0)
self.assertNotEqual(self.navigator.parent_next_sibling(mode=u'normal'), None)
self.assertEqual(vim.current.window.cursor, (17, 2))
def test_forward_movement_visual(self):
# selection start: <<
# selection end: >>
# cursor position: |
# << text
# text| >>
# text
# heading
set_visual_selection(u'V', 2, 4, cursor_pos=END)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV5gg'))
# << text
# text
# text| >>
# heading
set_visual_selection(u'V', 2, 5, cursor_pos=END)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV9gg'))
# << text
# x. heading
# text| >>
# heading
set_visual_selection(u'V', 12, 14, cursor_pos=END)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV15gg'))
set_visual_selection(u'V', 12, 15, cursor_pos=END)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV16gg'))
set_visual_selection(u'V', 12, 16, cursor_pos=END)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV17gg'))
# << text
# text
# text| >>
# heading
# EOF
set_visual_selection(u'V', 15, 17, cursor_pos=END)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV20gg'))
# << text >>
# heading
set_visual_selection(u'V', 1, 1, cursor_pos=START)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1ggV5gg'))
# << heading >>
# text
# heading
set_visual_selection(u'V', 2, 2, cursor_pos=START)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV5gg'))
# << text >>
# heading
set_visual_selection(u'V', 1, 1, cursor_pos=END)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1ggV5gg'))
# << |text
# heading
# text
# heading
# text >>
set_visual_selection(u'V', 1, 8, cursor_pos=START)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo'))
# << |heading
# text
# heading
# text >>
set_visual_selection(u'V', 2, 8, cursor_pos=START)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 6ggV8ggo'))
# << |heading
# text >>
# heading
set_visual_selection(u'V', 6, 8, cursor_pos=START)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 8ggV9gg'))
# << |x. heading
# text >>
# heading
set_visual_selection(u'V', 13, 15, cursor_pos=START)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV15gg'))
set_visual_selection(u'V', 13, 16, cursor_pos=START)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggV16ggo'))
set_visual_selection(u'V', 16, 16, cursor_pos=START)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggV17gg'))
# << |x. heading
# text >>
# heading
# EOF
set_visual_selection(u'V', 17, 17, cursor_pos=START)
self.assertNotEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 17ggV20gg'))
# << |heading
# text>>
# text
# EOF
set_visual_selection(u'V', 18, 19, cursor_pos=START)
self.assertEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 19ggV20gg'))
# << heading
# text|>>
# text
# EOF
set_visual_selection(u'V', 18, 19, cursor_pos=END)
self.assertEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 18ggV20gg'))
# << heading
# text|>>
# EOF
set_visual_selection(u'V', 18, 20, cursor_pos=END)
self.assertEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 18ggV20gg'))
# << |heading
# text>>
# EOF
set_visual_selection(u'V', 20, 20, cursor_pos=START)
self.assertEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 20ggV20gg'))
def test_forward_movement_visual_to_the_end_of_the_file(self):
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 1
Text 1
Bla bla
** Überschrift 1.1
Text 2
Bla Bla bla
** Überschrift 1.2
Text 3
**** Überschrift 1.2.1.falsch
Bla Bla bla bla
test
""".split(u'\n') ]
# << |heading
# text>>
# EOF
set_visual_selection(u'V', 15, 15, cursor_pos=START)
self.assertEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV17gg'))
set_visual_selection(u'V', 15, 17, cursor_pos=END)
self.assertEqual(self.navigator.next(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV17gg'))
def test_backward_movement_visual(self):
# selection start: <<
# selection end: >>
# cursor position: |
# << text | >>
# text
# heading
set_visual_selection(u'V', 1, 1, cursor_pos=START)
self.assertEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! gv'))
set_visual_selection(u'V', 1, 1, cursor_pos=END)
self.assertEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! gv'))
# << heading| >>
# text
# heading
set_visual_selection(u'V', 2, 2, cursor_pos=START)
self.assertEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV2ggo'))
set_visual_selection(u'V', 2, 2, cursor_pos=END)
self.assertEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV2ggo'))
# heading
# text
# << |text
# text >>
set_visual_selection(u'V', 3, 5, cursor_pos=START)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV5ggo'))
# heading
# text
# << text
# text| >>
set_visual_selection(u'V', 3, 5, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV3ggo'))
# heading
# text
# << text
# text| >>
set_visual_selection(u'V', 8, 9, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 6ggV8ggo'))
# heading
# << text
# x. heading
# text| >>
set_visual_selection(u'V', 12, 14, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV12gg'))
set_visual_selection(u'V', 12, 15, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV12gg'))
# heading
# << |text
# x. heading
# text >>
set_visual_selection(u'V', 12, 15, cursor_pos=START)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 10ggV15ggo'))
# heading
# << text
# x. heading| >>
set_visual_selection(u'V', 12, 13, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV12gg'))
# heading
# << text
# heading
# text
# x. heading| >>
set_visual_selection(u'V', 12, 16, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV15gg'))
# << text
# heading
# text
# heading| >>
set_visual_selection(u'V', 15, 17, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV16gg'))
# heading
# << |text
# text
# heading
# text >>
set_visual_selection(u'V', 4, 8, cursor_pos=START)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo'))
# heading
# << text
# text
# heading
# text| >>
set_visual_selection(u'V', 4, 8, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 4ggV5gg'))
# heading
# << text
# text
# heading
# text| >>
set_visual_selection(u'V', 4, 5, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV4ggo'))
# BOF
# << |heading
# text
# heading
# text >>
set_visual_selection(u'V', 2, 8, cursor_pos=START)
self.assertEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo'))
# BOF
# heading
# << text
# text| >>
set_visual_selection(u'V', 3, 4, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV3ggo'))
# BOF
# << heading
# text
# text| >>
set_visual_selection(u'V', 2, 4, cursor_pos=END)
self.assertNotEqual(self.navigator.previous(mode=u'visual'), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV2ggo'))
# << text
# heading
# text
# x. heading
# text| >>
set_visual_selection(u'V', 8, 14, cursor_pos=END)
self.navigator.previous(mode=u'visual')
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 8ggV12gg'))
def test_parent_movement_visual(self):
# selection start: <<
# selection end: >>
# cursor position: |
# heading
# << text|
# text
# text >>
set_visual_selection(u'V', 4, 8, cursor_pos=START)
self.navigator.parent(mode=u'visual')
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! gv'))
# heading
# << text|
# text
# text >>
set_visual_selection(u'V', 6, 8, cursor_pos=START)
self.navigator.parent(mode=u'visual')
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo'))
# heading
# << text
# text
# text| >>
set_visual_selection(u'V', 6, 8, cursor_pos=END)
self.navigator.parent(mode=u'visual')
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 6ggV5gg'))
# << |heading
# text
# text
# text >>
set_visual_selection(u'V', 2, 8, cursor_pos=START)
self.assertEqual(self.navigator.parent(mode=u'visual'), None)
# << heading
# text
# heading
# text| >>
set_visual_selection(u'V', 2, 8, cursor_pos=END)
self.navigator.parent(mode=u'visual')
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV5gg'))
set_visual_selection(u'V', 7, 8, cursor_pos=START)
self.navigator.parent(mode=u'visual')
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo'))
# heading
# heading
# << text
# text| >>
set_visual_selection(u'V', 12, 13, cursor_pos=END)
self.navigator.parent(mode=u'visual')
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV12gg'))
set_visual_selection(u'V', 10, 12, cursor_pos=START)
self.navigator.parent(mode=u'visual')
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV12ggo'))
# heading
# << text
# text
# heading| >>
set_visual_selection(u'V', 11, 17, cursor_pos=END)
self.assertEqual(self.navigator.parent(mode=u'visual'), None)
# << text
# heading
# text
# x. heading
# text| >>
set_visual_selection(u'V', 8, 14, cursor_pos=END)
self.navigator.parent(mode=u'visual')
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 8ggV12gg'))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(NavigatorTestCase)

View File

@@ -0,0 +1,385 @@
# -*- coding: utf-8 -*-
import unittest
import sys
sys.path.append(u'../ftplugin')
import vim
from orgmode._vim import ORGMODE
from orgmode.py3compat.encode_compatibility import *
counter = 0
class ShowHideTestCase(unittest.TestCase):
def setUp(self):
global counter
counter += 1
vim.CMDHISTORY = []
vim.CMDRESULTS = {}
vim.EVALHISTORY = []
vim.EVALRESULTS = {
# no org_todo_keywords for b
u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'),
# global values for org_todo_keywords
u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'),
u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')],
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("b:org_debug")'): u_encode(u'0'),
u_encode(u'exists("*repeat#set()")'): u_encode(u'0'),
u_encode(u'b:changedtick'): u_encode(u'%d' % counter),
u_encode(u"v:count"): u_encode(u'0')}
if not u'ShowHide' in ORGMODE.plugins:
ORGMODE.register_plugin(u'ShowHide')
self.showhide = ORGMODE.plugins[u'ShowHide']
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 1
Text 1
Bla bla
** Überschrift 1.1
Text 2
Bla Bla bla
** Überschrift 1.2
Text 3
**** Überschrift 1.2.1.falsch
Bla Bla bla bla
*** Überschrift 1.2.1
* Überschrift 2
* Überschrift 3
asdf sdf
""".split(u'\n') ]
def test_no_heading_toggle_folding(self):
vim.current.window.cursor = (1, 0)
self.assertEqual(self.showhide.toggle_folding(), None)
self.assertEqual(vim.EVALHISTORY[-1], u_encode(u'feedkeys("<Tab>", "n")'))
self.assertEqual(vim.current.window.cursor, (1, 0))
def test_toggle_folding_first_heading_with_no_children(self):
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 1
Text 1
Bla bla
* Überschrift 2
* Überschrift 3
asdf sdf
""".split(u'\n') ]
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'2'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(7)'): u_encode(u'-1'),
})
vim.current.window.cursor = (2, 0)
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1zo'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_close_one(self):
vim.current.window.cursor = (13, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(13)'): u_encode(u'-1'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 2)
self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'13,15foldclose!'))
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2zo'))
self.assertEqual(vim.current.window.cursor, (13, 0))
def test_toggle_folding_open_one(self):
vim.current.window.cursor = (10, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(10)'): u_encode(u'10'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1zo'))
self.assertEqual(vim.current.window.cursor, (10, 0))
def test_toggle_folding_close_multiple_all_open(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'-1'),
u_encode(u'foldclosed(16)'): u_encode(u'-1'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'2,16foldclose!'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_all_closed(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'2'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1zo'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_first_level_open(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'6'),
u_encode(u'foldclosed(10)'): u_encode(u'10'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'16'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 2)
self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 6gg1zo'))
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 10gg1zo'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_second_level_half_open(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(10)'): u_encode(u'10'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'16'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 4)
self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg2zo'))
self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg2zo'))
self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg2zo'))
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg2zo'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_other_second_level_half_open(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'6'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'16'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 4)
self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg2zo'))
self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg2zo'))
self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg2zo'))
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg2zo'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_third_level_half_open(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'-1'),
u_encode(u'foldclosed(16)'): u_encode(u'16'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 4)
self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg3zo'))
self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg3zo'))
self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg3zo'))
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg3zo'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_other_third_level_half_open(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'-1'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 4)
self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg3zo'))
self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg3zo'))
self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg3zo'))
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg3zo'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_other_third_level_half_open_second_level_half_closed(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'6'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'-1'),
})
self.assertNotEqual(self.showhide.toggle_folding(), None)
self.assertEqual(len(vim.CMDHISTORY), 4)
self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg3zo'))
self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg3zo'))
self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg3zo'))
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg3zo'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_no_heading_toggle_folding_reverse(self):
vim.current.window.cursor = (1, 0)
self.assertEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(vim.EVALHISTORY[-1], u_encode(u'feedkeys("<Tab>", "n")'))
self.assertEqual(vim.current.window.cursor, (1, 0))
def test_toggle_folding_first_heading_with_no_children_reverse(self):
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 1
Text 1
Bla bla
* Überschrift 2
* Überschrift 3
asdf sdf
""".split(u'\n') ]
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'2'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(7)'): u_encode(u'-1'),
})
vim.current.window.cursor = (2, 0)
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'2,5foldopen!'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_close_one_reverse(self):
vim.current.window.cursor = (13, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(13)'): u_encode(u'-1'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 13ggzc'))
self.assertEqual(vim.current.window.cursor, (13, 0))
def test_toggle_folding_open_one_reverse(self):
vim.current.window.cursor = (10, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(10)'): u_encode(u'10'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'10,16foldopen!'))
self.assertEqual(vim.current.window.cursor, (10, 0))
def test_toggle_folding_close_multiple_all_open_reverse(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'-1'),
u_encode(u'foldclosed(16)'): u_encode(u'-1'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 2)
self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13ggzc'))
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggzc'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_all_closed_reverse(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'2'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'2,16foldopen!'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_first_level_open_reverse(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'6'),
u_encode(u'foldclosed(10)'): u_encode(u'10'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'16'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggzc'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_second_level_half_open_reverse(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(10)'): u_encode(u'10'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'16'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 6ggzc'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_other_second_level_half_open_reverse(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'6'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'16'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 10ggzc'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_third_level_half_open_reverse(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'-1'),
u_encode(u'foldclosed(16)'): u_encode(u'16'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 13ggzc'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_other_third_level_half_open_reverse(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'-1'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'-1'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggzc'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def test_toggle_folding_open_multiple_other_third_level_half_open_second_level_half_closed_reverse(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS.update({
u_encode(u'foldclosed(2)'): u_encode(u'-1'),
u_encode(u'foldclosed(6)'): u_encode(u'6'),
u_encode(u'foldclosed(10)'): u_encode(u'-1'),
u_encode(u'foldclosed(13)'): u_encode(u'13'),
u_encode(u'foldclosed(16)'): u_encode(u'-1'),
})
self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None)
self.assertEqual(len(vim.CMDHISTORY), 1)
self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggzc'))
self.assertEqual(vim.current.window.cursor, (2, 0))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(ShowHideTestCase)

View File

@@ -0,0 +1,176 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest
import sys
sys.path.append(u'../ftplugin')
import vim
from orgmode._vim import indent_orgmode, fold_orgmode, ORGMODE
from orgmode.py3compat.encode_compatibility import *
ORGMODE.debug = True
START = True
END = False
counter = 0
class TagsPropertiesTestCase(unittest.TestCase):
def setUp(self):
global counter
counter += 1
vim.CMDHISTORY = []
vim.CMDRESULTS = {}
vim.EVALHISTORY = []
vim.EVALRESULTS = {
# no org_todo_keywords for b
u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'),
# global values for org_todo_keywords
u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'),
u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')],
u_encode(u'&ts'): u_encode(u'6'),
u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'),
u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'),
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("b:org_debug")'): u_encode(u'0'),
u_encode(u'exists("*repeat#set()")'): u_encode(u'0'),
u_encode(u'b:changedtick'): (u_encode(u'%d' % counter)),
u_encode(u"v:count"): u_encode(u'0')}
if not u'TagsProperties' in ORGMODE.plugins:
ORGMODE.register_plugin(u'TagsProperties')
self.tagsproperties = ORGMODE.plugins[u'TagsProperties']
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Überschrift 1
Text 1
Bla bla
** Überschrift 1.1
Text 2
Bla Bla bla
** Überschrift 1.2
Text 3
**** Überschrift 1.2.1.falsch
Bla Bla bla bla
*** Überschrift 1.2.1
* Überschrift 2
* Überschrift 3
asdf sdf
""".split(u'\n') ]
def test_new_property(self):
u""" TODO: Docstring for test_new_property
:returns: TODO
"""
pass
def test_set_tags(self):
# set first tag
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello:')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:'))
# set second tag
vim.EVALRESULTS[u_encode(u'input("Tags: ", ":hello:", "customlist,Org_complete_tags")')] = u_encode(u':hello:world:')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:'))
def test_parse_tags_no_colons_single_tag(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'hello')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:'))
def test_parse_tags_no_colons_multiple_tags(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'hello:world')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:'))
def test_parse_tags_single_colon_left_single_tag(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:'))
def test_parse_tags_single_colon_left_multiple_tags(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello:world')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:'))
def test_parse_tags_single_colon_right_single_tag(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'hello:')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:'))
def test_parse_tags_single_colon_right_multiple_tags(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'hello:world:')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:'))
def test_filter_empty_tags(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'::hello::')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:'))
def test_delete_tags(self):
# set up
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello:world:')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:'))
# delete second of two tags
vim.EVALRESULTS[u_encode(u'input("Tags: ", ":hello:world:", "customlist,Org_complete_tags")')] = u_encode(u':hello:')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:'))
# delete last tag
vim.EVALRESULTS[u_encode(u'input("Tags: ", ":hello:", "customlist,Org_complete_tags")')] = u_encode(u'')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
def test_realign_tags_noop(self):
vim.current.window.cursor = (2, 0)
self.tagsproperties.realign_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
def test_realign_tags_remove_spaces(self):
# remove spaces in multiple locations
vim.current.buffer[1] = u_encode(u'* Überschrift 1 ')
vim.current.window.cursor = (2, 0)
self.tagsproperties.realign_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
# remove tabs and spaces in multiple locations
vim.current.buffer[1] = u_encode(u'*\t \tÜberschrift 1 \t')
vim.current.window.cursor = (2, 0)
self.tagsproperties.realign_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1'))
def test_realign_tags(self):
vim.current.window.cursor = (2, 0)
vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello:world:')
self.tagsproperties.set_tags()
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:'))
d = ORGMODE.get_document()
heading = d.find_current_heading()
self.assertEqual(str(heading), u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:'))
self.tagsproperties.realign_tags()
heading = d.find_current_heading()
self.assertEqual(str(heading), u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:'))
self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:'))
def suite():
return unittest.TestLoader().loadTestsFromTestCase(TagsPropertiesTestCase)

View File

@@ -0,0 +1,422 @@
# -*- coding: utf-8 -*-
import sys
sys.path.append(u'../ftplugin')
import unittest
from orgmode.liborgmode.base import Direction
from orgmode.vimbuffer import VimBuffer
from orgmode.plugins.Todo import Todo
import vim
from orgmode.py3compat.encode_compatibility import *
counter = 0
class TodoTestCase(unittest.TestCase):
u"""Tests all the functionality of the TODO module."""
def setUp(self):
# set content of the buffer
global counter
counter += 1
vim.EVALHISTORY = []
vim.EVALRESULTS = {
# no org_todo_keywords for b
u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'),
# global values for org_todo_keywords
u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'),
u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')],
u_encode(u'exists("g:org_debug")'): u_encode(u'0'),
u_encode(u'exists("b:org_debug")'): u_encode(u'0'),
u_encode(u'exists("*repeat#set()")'): u_encode(u'0'),
u_encode(u'b:changedtick'): u_encode(u'%d' % counter),
u_encode(u"v:count"): u_encode(u'0')
}
vim.current.buffer[:] = [ u_encode(i) for i in u"""
* Heading 1
** Text 1
*** Text 2
* Text 1
** Text 1
some text that is
no heading
""".split(u'\n') ]
# toggle
def test_toggle_todo_with_no_heading(self):
# nothing should happen
vim.current.window.cursor = (1, 0)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[0], u'')
# and repeat it -> it should not change
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[0], u'')
def test_todo_toggle_NOTODO(self):
vim.current.window.cursor = (2, 0)
vim.current.buffer[1] = u_encode(u'** NOTODO Überschrift 1.1')
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u_encode(u'** TODO NOTODO Überschrift 1.1'))
def test_toggle_todo_in_heading_with_no_todo_state_different_levels(self):
# level 1
vim.current.window.cursor = (2, 0)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* TODO Heading 1')
self.assertEqual((2, 0), vim.current.window.cursor)
# level 2
vim.current.window.cursor = (3, 0)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[2], u'** TODO Text 1')
# level 2
vim.current.window.cursor = (4, 4)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[3], u'*** TODO Text 2')
self.assertEqual((4, 9), vim.current.window.cursor)
def test_circle_through_todo_states(self):
# * Heading 1 -->
# * TODO Heading 1 -->
# * DONE Heading 1 -->
# * Heading 1 -->
# * TODO Heading 1 -->
# * DONE Heading 1
vim.current.window.cursor = (2, 6)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* TODO Heading 1')
self.assertEqual((2, 11), vim.current.window.cursor)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* DONE Heading 1')
self.assertEqual((2, 11), vim.current.window.cursor)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* Heading 1')
self.assertEqual((2, 6), vim.current.window.cursor)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* TODO Heading 1')
self.assertEqual((2, 11), vim.current.window.cursor)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* DONE Heading 1')
self.assertEqual((2, 11), vim.current.window.cursor)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* Heading 1')
self.assertEqual((2, 6), vim.current.window.cursor)
def test_circle_through_todo_states_with_more_states(self):
# * Heading 1 -->
# * TODO Heading 1 -->
# * STARTED Heading 1 -->
# * DONE Heading 1 -->
# * Heading 1 -->
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'STARTED'), u_encode(u'DONE'),
u_encode(u'|')]
vim.current.window.cursor = (2, 0)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* TODO Heading 1')
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* STARTED Heading 1')
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* DONE Heading 1')
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[1], u'* Heading 1')
def test_toggle_todo_with_cursor_in_text_not_heading(self):
# nothing should happen
vim.current.window.cursor = (7, 0)
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[5], u'** TODO Text 1')
self.assertEqual(vim.current.window.cursor, (7, 0))
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[5], u'** DONE Text 1')
self.assertEqual(vim.current.window.cursor, (7, 0))
Todo.toggle_todo_state()
self.assertEqual(vim.current.buffer[5], u'** Text 1')
self.assertEqual(vim.current.window.cursor, (7, 0))
# get_states
def test_get_states_without_seperator(self):
u"""The last element in the todostates shouold be used as DONE-state when no sperator is given"""
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'DONE')]
states_todo, states_done = VimBuffer().get_todo_states()[0]
expected_todo, expected_done = [u'TODO'], [u'DONE']
self.assertEqual(states_todo, expected_todo)
self.assertEqual(states_done, expected_done)
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'), u_encode(u'DONE')]
states_todo, states_done = VimBuffer().get_todo_states()[0]
expected_todo = [u'TODO', u'INPROGRESS']
expected_done = [u'DONE']
self.assertEqual(states_todo, expected_todo)
self.assertEqual(states_done, expected_done)
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'),
u_encode(u'DUMMY'), u_encode(u'DONE')]
states_todo, states_done = VimBuffer().get_todo_states()[0]
expected_todo = [u'TODO', u'INPROGRESS', u'DUMMY']
expected_done = [u'DONE']
self.assertEqual(states_todo, expected_todo)
self.assertEqual(states_done, expected_done)
def test_get_states_with_seperator(self):
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')]
states_todo, states_done = VimBuffer().get_todo_states()[0]
expected_todo = [u'TODO']
expected_done = [u'DONE']
self.assertEqual(states_todo, expected_todo)
self.assertEqual(states_done, expected_done)
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'), u_encode(u'|'),
u_encode(u'DONE')]
states_todo, states_done = VimBuffer().get_todo_states()[0]
expected_todo = [u'TODO', u'INPROGRESS']
expected_done = [u'DONE']
self.assertEqual(states_todo, expected_todo)
self.assertEqual(states_done, expected_done)
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'),
u_encode(u'DUMMY'), u_encode(u'|'), u_encode(u'DONE')]
states_todo, states_done = VimBuffer().get_todo_states()[0]
expected_todo = [u'TODO', u'INPROGRESS', u'DUMMY']
expected_done = [u'DONE']
self.assertEqual(states_todo, expected_todo)
self.assertEqual(states_done, expected_done)
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'),
u_encode(u'DUMMY'), u_encode(u'|'), u_encode(u'DELEGATED'), u_encode(u'DONE')]
states_todo, states_done = VimBuffer().get_todo_states()[0]
expected_todo =[u'TODO', u'INPROGRESS', u'DUMMY']
expected_done = [u'DELEGATED', u'DONE']
self.assertEqual(states_todo, expected_todo)
self.assertEqual(states_done, expected_done)
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONEX'),
u_encode(u'DUMMY'), u_encode(u'DELEGATED'), u_encode(u'DONE')]
states_todo, states_done = VimBuffer().get_todo_states()[0]
expected_todo = [u'TODO']
expected_done = [u'DONEX', u'DUMMY', u'DELEGATED', u'DONE']
self.assertEqual(states_todo, expected_todo)
self.assertEqual(states_done, expected_done)
vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [[u_encode(u'TODO(t)'), u_encode(u'|'), u_encode(u'DONEX')],
[u_encode(u'DUMMY'), u_encode(u'DELEGATED'), u_encode(u'DONE')]]
states_todo, states_done = VimBuffer().get_todo_states()[0]
expected_todo = [u'TODO']
expected_done = [u'DONEX']
self.assertEqual(states_todo, expected_todo)
self.assertEqual(states_done, expected_done)
# get_next_state
def test_get_next_state_with_no_current_state(self):
states = [((u'TODO', ), (u'DONE', ))]
current_state = u''
self.assertEquals(Todo._get_next_state(current_state, states), u'TODO')
states = [((u'TODO', u'NEXT'), (u'DELEGATED', u'DONE'))]
self.assertEquals(Todo._get_next_state(current_state, states), u'TODO')
states = [((u'NEXT', ), (u'DELEGATED', u'DONE'))]
self.assertEquals(Todo._get_next_state(current_state, states), u'NEXT')
def test_get_next_state_backward_with_no_current_state(self):
states = [((u'TODO', ), (u'DONE', ))]
current_state = u''
self.assertEquals(Todo._get_next_state(current_state, states,
Direction.BACKWARD), u'DONE')
states = [((u'TODO', u'NEXT'), (u'DELEGATED', u'DONE'))]
self.assertEquals(Todo._get_next_state(current_state, states,
Direction.BACKWARD), u'DONE')
states = [((u'NEXT', ), (u'DELEGATED', u'DONE'))]
self.assertEquals(Todo._get_next_state(current_state, states,
Direction.BACKWARD), u'DONE')
def test_get_next_state_with_invalid_current_state(self):
states = [((u'TODO', ), (u'DONE', ))]
current_state = u'STI'
self.assertEquals(Todo._get_next_state(current_state, states), u'TODO')
states = [((u'TODO', u'NEXT'), (u'DELEGATED', u'DONE'))]
self.assertEquals(Todo._get_next_state(current_state, states), u'TODO')
states = [((u'NEXT', ), (u'DELEGATED', u'DONE'))]
self.assertEquals(Todo._get_next_state(current_state, states), u'NEXT')
def test_get_next_state_backward_with_invalid_current_state(self):
states = [((u'TODO', ), (u'DONE', ))]
current_state = u'STI'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, u'DONE')
states = [((u'TODO', u'NEXT'), (u'DELEGATED', u'DONE'))]
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, u'DONE')
states = [((u'NEXT', ), (u'DELEGATED', u'DONE'))]
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, u'DONE')
def test_get_next_state_with_current_state_equals_todo_state(self):
states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))]
current_state = u'TODO'
self.assertEquals(Todo._get_next_state(current_state, states), u'NEXT')
current_state = u'NEXT'
self.assertEquals(Todo._get_next_state(current_state, states), u'NOW')
def test_get_next_state_backward_with_current_state_equals_todo_state(self):
states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))]
current_state = u'TODO'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, None)
def test_get_next_state_backward_misc(self):
states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))]
current_state = u'DONE'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, u'DELEGATED')
current_state = u'DELEGATED'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, u'NOW')
current_state = u'NOW'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, u'NEXT')
current_state = u'NEXT'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, u'TODO')
current_state = u'TODO'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, None)
current_state = None
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, u'DONE')
def test_get_next_state_with_jump_from_todo_to_done(self):
states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))]
current_state = u'NOW'
self.assertEquals(Todo._get_next_state(current_state, states), u'DELEGATED')
def test_get_next_state_with_jump_from_done_to_todo(self):
states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))]
current_state = u'DONE'
self.assertEquals(Todo._get_next_state(current_state, states), None)
def test_get_next_state_in_current_sequence(self):
states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE')), ((u'QA', ), (u'RELEASED', ))]
current_state = u'QA'
result = Todo._get_next_state(current_state, states,
Direction.FORWARD)
self.assertEquals(result, u'RELEASED')
def test_get_next_state_in_current_sequence_with_access_keys(self):
states = [((u'TODO(t)', u'NEXT(n)', u'NOW(w)'), (u'DELEGATED(g)', u'DONE(d)')), ((u'QA(q)', ), (u'RELEASED(r)', ))]
current_state = u'QA'
result = Todo._get_next_state(current_state, states,
Direction.FORWARD)
self.assertEquals(result, u'RELEASED')
current_state = u'NEXT'
result = Todo._get_next_state(current_state, states,
Direction.FORWARD)
self.assertEquals(result, u'NOW')
current_state = u'TODO'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, None)
current_state = None
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD)
self.assertEquals(result, u'RELEASED')
def test_get_next_keyword_sequence(self):
states = [((u'TODO(t)', u'NEXT(n)', u'NOW(w)'), (u'DELEGATED(g)', u'DONE(d)')), ((u'QA(q)', ), (u'RELEASED(r)', ))]
current_state = None
result = Todo._get_next_state(current_state, states,
Direction.FORWARD, next_set=True)
self.assertEquals(result, u'TODO')
current_state = None
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD, next_set=True)
self.assertEquals(result, u'QA')
current_state = u'TODO'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD, next_set=True)
self.assertEquals(result, None)
current_state = u'TODO'
result = Todo._get_next_state(current_state, states,
Direction.FORWARD, next_set=True)
self.assertEquals(result, u'QA')
current_state = u'NOW'
result = Todo._get_next_state(current_state, states,
Direction.FORWARD, next_set=True)
self.assertEquals(result, u'QA')
current_state = u'DELEGATED'
result = Todo._get_next_state(current_state, states,
Direction.FORWARD, next_set=True)
self.assertEquals(result, u'QA')
current_state = u'QA'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD, next_set=True)
self.assertEquals(result, u'TODO')
current_state = u'QA'
result = Todo._get_next_state(current_state, states,
Direction.FORWARD, next_set=True)
self.assertEquals(result, None)
current_state = u'RELEASED'
result = Todo._get_next_state(current_state, states,
Direction.FORWARD, next_set=True)
self.assertEquals(result, None)
current_state = u'RELEASED'
result = Todo._get_next_state(current_state, states,
Direction.BACKWARD, next_set=True)
self.assertEquals(result, u'TODO')
def suite():
return unittest.TestLoader().loadTestsFromTestCase(TodoTestCase)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,88 @@
# -*- coding: utf-8 -*-
class VimWindow(object):
u""" Docstring for VimWindow """
def __init__(self, test):
object.__init__(self)
self._test = test
self.cursor = (1, 0)
def buffer():
def fget(self):
return self._test.buffer
def fset(self, value):
self._test.buffer = value
return locals()
buffer = property(**buffer())
class VimBuffer(list):
def __init__(self, iterable=None):
self.number = 0
if iterable is not None:
list.__init__(self, iterable)
else:
list.__init__(self)
def append(self, o):
u"""
mimic the specific behavior of vim.current.buffer
"""
if isinstance(o, list) or isinstance(o, tuple):
for i in o:
list.append(self, i)
else:
list.append(self, o)
class VimTest(object):
u""" Replacement for vim API """
def __init__(self):
object.__init__(self)
self._buffer = VimBuffer()
self.window = VimWindow(self)
def buffer():
def fget(self):
return self._buffer
def fset(self, value):
self._buffer = VimBuffer(value)
return locals()
buffer = property(**buffer())
EVALHISTORY = []
EVALRESULTS = {
u'exists("g:org_debug")': 0,
u'exists("b:org_debug")': 0,
u'exists("*repeat#set()")': 0,
u'exists("b:org_plugins")': 0,
u'exists("g:org_plugins")': 0,
u'b:changedtick': 0,
}
def eval(cmd):
u""" evaluate command
:returns: results stored in EVALRESULTS
"""
EVALHISTORY.append(cmd)
return EVALRESULTS.get(cmd, None)
CMDHISTORY = []
CMDRESULTS = {}
def command(cmd):
CMDHISTORY.append(cmd)
return CMDRESULTS.get(cmd, None)
current = VimTest()