Re-enable all screen tests

This commit is contained in:
Kovid Goyal 2016-11-08 09:53:51 +05:30
parent 3dc74413a5
commit 0a69f00ab4
5 changed files with 28 additions and 16 deletions

View File

@ -25,7 +25,7 @@ typedef unsigned int index_type;
#define CHAR_MASK 0xFFFFFF #define CHAR_MASK 0xFFFFFF
#define ATTRS_SHIFT 24 #define ATTRS_SHIFT 24
#define ATTRS_MASK_WITHOUT_WIDTH 0xFC000000 #define ATTRS_MASK_WITHOUT_WIDTH 0xFC000000
#define WIDTH_MASK 0xFF #define WIDTH_MASK 3
#define DECORATION_SHIFT 2 #define DECORATION_SHIFT 2
#define BOLD_SHIFT 4 #define BOLD_SHIFT 4
#define ITALIC_SHIFT 5 #define ITALIC_SHIFT 5

View File

@ -97,6 +97,7 @@ line(LineBuf *self, PyObject *y) {
} }
self->line->ynum = idx; self->line->ynum = idx;
self->line->xnum = self->xnum; self->line->xnum = self->xnum;
self->line->continued = self->continued_map[idx];
INIT_LINE(self, self->line, self->line_map[idx]); INIT_LINE(self, self->line, self->line_map[idx]);
Py_INCREF(self->line); Py_INCREF(self->line);
return (PyObject*)self->line; return (PyObject*)self->line;

View File

@ -62,6 +62,8 @@ as_unicode(Line* self) {
return NULL; return NULL;
} }
for(index_type i = 0; i < self->xnum; i++) { for(index_type i = 0; i < self->xnum; i++) {
char_type attrs = self->chars[i] >> ATTRS_SHIFT;
if ((attrs & WIDTH_MASK) < 1) continue;
buf[n++] = self->chars[i] & CHAR_MASK; buf[n++] = self->chars[i] & CHAR_MASK;
char_type cc = self->combining_chars[i]; char_type cc = self->combining_chars[i];
Py_UCS4 cc1 = cc & CC_MASK, cc2; Py_UCS4 cc1 = cc & CC_MASK, cc2;
@ -76,6 +78,15 @@ as_unicode(Line* self) {
return ans; return ans;
} }
static PyObject*
width(Line *self, PyObject *val) {
#define width_doc "width_doc(x) -> the width of the character at x"
unsigned long x = PyLong_AsUnsignedLong(val);
if (x >= self->xnum) { PyErr_SetString(PyExc_ValueError, "Out of bounds"); return NULL; }
char_type attrs = self->chars[x] >> ATTRS_SHIFT;
return PyLong_FromUnsignedLong((unsigned long) (attrs & WIDTH_MASK));
}
static PyObject* static PyObject*
add_combining_char(Line* self, PyObject *args) { add_combining_char(Line* self, PyObject *args) {
#define add_combining_char_doc "add_combining_char(x, ch) -> Add the specified character as a combining char to the specified cell." #define add_combining_char_doc "add_combining_char(x, ch) -> Add the specified character as a combining char to the specified cell."
@ -313,6 +324,7 @@ static PyMethodDef methods[] = {
METHOD(left_shift, METH_VARARGS) METHOD(left_shift, METH_VARARGS)
METHOD(set_char, METH_VARARGS) METHOD(set_char, METH_VARARGS)
METHOD(set_attribute, METH_VARARGS) METHOD(set_attribute, METH_VARARGS)
METHOD(width, METH_O)
{NULL} /* Sentinel */ {NULL} /* Sentinel */
}; };

View File

@ -9,10 +9,9 @@ from collections import deque, namedtuple
from typing import Sequence from typing import Sequence
from pyte import charsets as cs, graphics as g, modes as mo from pyte import charsets as cs, graphics as g, modes as mo
from .data_types import Line, Cursor, rewrap_lines
from .utils import wcwidth, is_simple_string, sanitize_title from .utils import wcwidth, is_simple_string, sanitize_title
from .unicode import ignore_pat from .unicode import ignore_pat
from .fast_data_types import LineBuf, REVERSE from .fast_data_types import LineBuf, REVERSE, Cursor
#: A container for screen's scroll margins. #: A container for screen's scroll margins.
@ -91,7 +90,7 @@ class Screen:
@property @property
def display(self) -> Sequence[str]: def display(self) -> Sequence[str]:
return tuple(map(str, self.linebuf)) return tuple(map(lambda l: str(self.linebuf.line(l)), range(self.linebuf.ynum)))
def toggle_screen_buffer(self): def toggle_screen_buffer(self):
self.save_cursor() self.save_cursor()
@ -609,7 +608,7 @@ class Screen:
num = min(self.columns - x, count) num = min(self.columns - x, count)
line = self.linebuf.line(y) line = self.linebuf.line(y)
line.right_shift(x, num) line.right_shift(x, num)
line.apply_cursor(self.cursor, x, num, clear_char=True) line.apply_cursor(self.cursor, x, num, True)
self.update_cell_range(y, x, self.columns - 1) self.update_cell_range(y, x, self.columns - 1)
def delete_characters(self, count=1): def delete_characters(self, count=1):
@ -633,7 +632,7 @@ class Screen:
# cell of a wide character? # cell of a wide character?
line = self.linebuf.line(y) line = self.linebuf.line(y)
line.left_shift(x, num) line.left_shift(x, num)
line.apply_cursor(self.cursor, self.columns - num, num, clear_char=True) line.apply_cursor(self.cursor, self.columns - num, num, True)
self.update_cell_range(y, x, self.columns - 1) self.update_cell_range(y, x, self.columns - 1)
def erase_characters(self, count=1): def erase_characters(self, count=1):
@ -655,7 +654,7 @@ class Screen:
# TODO: Same set of wide character questions as for delete_characters() # TODO: Same set of wide character questions as for delete_characters()
num = min(self.columns - x, count) num = min(self.columns - x, count)
l = self.linebuf.line(y) l = self.linebuf.line(y)
l.apply_cursor(self.cursor, x, num, clear_char=True) l.apply_cursor(self.cursor, x, num, True)
self.update_cell_range(y, x, min(x + num, self.columns) - 1) self.update_cell_range(y, x, min(x + num, self.columns) - 1)
def erase_in_line(self, how=0, private=False): def erase_in_line(self, how=0, private=False):
@ -691,7 +690,7 @@ class Screen:
if private: if private:
line.clear_text(s, n) line.clear_text(s, n)
else: else:
line.apply_cursor(c, s, n, clear_char=True) line.apply_cursor(c, s, n, True)
self.update_cell_range(y, s, min(s + n, self.columns) - 1) self.update_cell_range(y, s, min(s + n, self.columns) - 1)
def erase_in_display(self, how=0, private=False): def erase_in_display(self, how=0, private=False):
@ -726,7 +725,7 @@ class Screen:
if private: if private:
self.linebuf.line(line).clear_text(0, self.columns) self.linebuf.line(line).clear_text(0, self.columns)
else: else:
self.linebuf.line(line).apply_cursor(self.cursor, 0, self.columns, clear_char=True) self.linebuf.line(line).apply_cursor(self.cursor, 0, self.columns, True)
self.update_line_range(interval[0], interval[1] - 1) self.update_line_range(interval[0], interval[1] - 1)
# In case of 0 or 1 we have to erase the line with the cursor also # In case of 0 or 1 we have to erase the line with the cursor also

View File

@ -9,7 +9,7 @@ from kitty.screen import mo
class TestScreen(BaseTest): class TestScreen(BaseTest):
def xtest_draw_fast(self): def test_draw_fast(self):
# Test in line-wrap, non-insert mode # Test in line-wrap, non-insert mode
s, t = self.create_screen() s, t = self.create_screen()
s.draw(b'a' * 5) s.draw(b'a' * 5)
@ -17,8 +17,8 @@ class TestScreen(BaseTest):
self.ae(s.cursor.x, 5), self.ae(s.cursor.y, 0) self.ae(s.cursor.x, 5), self.ae(s.cursor.y, 0)
self.assertChanges(t, ignore='cursor', cells={0: ((0, 4),)}) self.assertChanges(t, ignore='cursor', cells={0: ((0, 4),)})
s.draw(b'b' * 7) s.draw(b'b' * 7)
self.assertTrue(s.line(1).continued) self.assertTrue(s.linebuf.is_continued(1))
self.assertTrue(s.line(2).continued) self.assertTrue(s.linebuf.is_continued(2))
self.ae(str(s.line(0)), 'a' * 5) self.ae(str(s.line(0)), 'a' * 5)
self.ae(str(s.line(1)), 'b' * 5) self.ae(str(s.line(1)), 'b' * 5)
self.ae(str(s.line(2)), 'b' * 2 + ' ' * 3) self.ae(str(s.line(2)), 'b' * 2 + ' ' * 3)
@ -52,7 +52,7 @@ class TestScreen(BaseTest):
self.ae((s.cursor.x, s.cursor.y), (2, 4)) self.ae((s.cursor.x, s.cursor.y), (2, 4))
self.assertChanges(t, ignore='cursor', cells={4: ((0, 4),)}) self.assertChanges(t, ignore='cursor', cells={4: ((0, 4),)})
def xtest_draw_char(self): def test_draw_char(self):
# Test in line-wrap, non-insert mode # Test in line-wrap, non-insert mode
s, t = self.create_screen() s, t = self.create_screen()
s.draw('ココx'.encode('utf-8')) s.draw('ココx'.encode('utf-8'))
@ -101,7 +101,7 @@ class TestScreen(BaseTest):
self.ae((s.cursor.x, s.cursor.y), (2, 4)) self.ae((s.cursor.x, s.cursor.y), (2, 4))
self.assertChanges(t, ignore='cursor', cells={4: ((0, 4),)}) self.assertChanges(t, ignore='cursor', cells={4: ((0, 4),)})
def xtest_char_manipulation(self): def test_char_manipulation(self):
s, t = self.create_screen() s, t = self.create_screen()
def init(): def init():
@ -162,7 +162,7 @@ class TestScreen(BaseTest):
s.erase_in_line(2, private=True) s.erase_in_line(2, private=True)
self.ae((False, False, False, False, False), tuple(map(lambda i: s.line(0).cursor_from(i).bold, range(5)))) self.ae((False, False, False, False, False), tuple(map(lambda i: s.line(0).cursor_from(i).bold, range(5))))
def xtest_erase_in_screen(self): def test_erase_in_screen(self):
s, t = self.create_screen() s, t = self.create_screen()
def init(): def init():
@ -193,7 +193,7 @@ class TestScreen(BaseTest):
self.assertChanges(t, lines=set(range(5))) self.assertChanges(t, lines=set(range(5)))
self.assertFalse(s.line(0).cursor_from(1).bold) self.assertFalse(s.line(0).cursor_from(1).bold)
def xtest_cursor_movement(self): def test_cursor_movement(self):
s, t = self.create_screen() s, t = self.create_screen()
s.draw(b'12345' * 5) s.draw(b'12345' * 5)
t.reset() t.reset()