##// END OF EJS Templates
BUG: use a :memory: history DB for testing. Refactor the initialization of the HistoryManager to support this.
BUG: use a :memory: history DB for testing. Refactor the initialization of the HistoryManager to support this.

File last commit:

r3465:62118c78
r3465:62118c78
Show More
test_history.py
111 lines | 4.4 KiB | text/x-python | PythonLexer
Thomas Kluyver
Add file encoding declarations to two tests.
r3449 # coding: utf-8
Satrajit Ghosh
History refactored and saved to json file...
r3240 """Tests for the IPython tab-completion machinery.
"""
#-----------------------------------------------------------------------------
# Module imports
#-----------------------------------------------------------------------------
# stdlib
import os
import sys
import unittest
# third party
import nose.tools as nt
# our own packages
from IPython.utils.tempdir import TemporaryDirectory
Thomas Kluyver
Passing IPython.core tests.
r3396 from IPython.core.history import HistoryManager, extract_hist_ranges
Satrajit Ghosh
History refactored and saved to json file...
r3240
Thomas Kluyver
Tweak code with suggestions from yesterday.
r3458 def setUp():
Thomas Kluyver
Moved unicode tests into main test suite. Reverified that both fail if the fixes in previous commits are undone.
r3447 nt.assert_equal(sys.getdefaultencoding(), "ascii")
Thomas Kluyver
Tweak code with suggestions from yesterday.
r3458
def test_history():
Satrajit Ghosh
History refactored and saved to json file...
r3240 ip = get_ipython()
with TemporaryDirectory() as tmpdir:
Robert Kern
BUG: use a :memory: history DB for testing. Refactor the initialization of the HistoryManager to support this.
r3465 # Make a new :memory: DB.
Satrajit Ghosh
History refactored and saved to json file...
r3240 hist_manager_ori = ip.history_manager
try:
Robert Kern
BUG: use a :memory: history DB for testing. Refactor the initialization of the HistoryManager to support this.
r3465 ip.history_manager = HistoryManager(shell=ip, hist_file=':memory:')
Thomas Kluyver
Tweak unicode history test so it will work in Windows.
r3450 hist = ['a=1', 'def f():\n test = 1\n return test', u"b='€Æ¾÷ß'"]
Thomas Kluyver
Passing IPython.core tests.
r3396 for i, h in enumerate(hist, start=1):
ip.history_manager.store_inputs(i, h)
Thomas Kluyver
Simplify magic_history display code, allow get_hist_search to include output in return values, and add some unit tests.
r3400 ip.history_manager.db_log_output = True
# Doesn't match the input, but we'll just check it's stored.
Thomas Kluyver
Separate 'Out' in user_ns from the output history logging.
r3417 ip.history_manager.output_hist_reprs[3].append("spam")
Thomas Kluyver
Allow history to store multiple outputs for a single input line.
r3415 ip.history_manager.store_output(3)
Thomas Kluyver
Simplify magic_history display code, allow get_hist_search to include output in return values, and add some unit tests.
r3400
Thomas Kluyver
Passing IPython.core tests.
r3396 nt.assert_equal(ip.history_manager.input_hist_raw, [''] + hist)
# Check lines were written to DB
c = ip.history_manager.db.execute("SELECT source_raw FROM history")
nt.assert_equal([x for x, in c], hist)
Thomas Kluyver
Add test code for history session offset.
r3383
Thomas Kluyver
Passing IPython.core tests.
r3396 # New session
ip.history_manager.reset()
Thomas Kluyver
Add test code for history session offset.
r3383 newcmds = ["z=5","class X(object):\n pass", "k='p'"]
Thomas Kluyver
Simplify magic_history display code, allow get_hist_search to include output in return values, and add some unit tests.
r3400 for i, cmd in enumerate(newcmds, start=1):
Thomas Kluyver
Passing IPython.core tests.
r3396 ip.history_manager.store_inputs(i, cmd)
Thomas Kluyver
Rename history retrieval methods, and improve docstrings.
r3435 gothist = ip.history_manager.get_range(start=1, stop=4)
Thomas Kluyver
Passing IPython.core tests.
r3396 nt.assert_equal(list(gothist), zip([0,0,0],[1,2,3], newcmds))
# Previous session:
Thomas Kluyver
Rename history retrieval methods, and improve docstrings.
r3435 gothist = ip.history_manager.get_range(-1, 1, 4)
Thomas Kluyver
Passing IPython.core tests.
r3396 nt.assert_equal(list(gothist), zip([1,1,1],[1,2,3], hist))
Thomas Kluyver
Add test code for history session offset.
r3383
Thomas Kluyver
Simplify magic_history display code, allow get_hist_search to include output in return values, and add some unit tests.
r3400 # Check get_hist_tail
Thomas Kluyver
Rename history retrieval methods, and improve docstrings.
r3435 gothist = ip.history_manager.get_tail(4, output=True,
Thomas Kluyver
Further refinements to history interfaces.
r3420 include_latest=True)
Thomas Kluyver
Separate 'Out' in user_ns from the output history logging.
r3417 expected = [(1, 3, (hist[-1], ["spam"])),
Thomas Kluyver
Simplify magic_history display code, allow get_hist_search to include output in return values, and add some unit tests.
r3400 (2, 1, (newcmds[0], None)),
(2, 2, (newcmds[1], None)),
(2, 3, (newcmds[2], None)),]
nt.assert_equal(list(gothist), expected)
Thomas Kluyver
Rename history retrieval methods, and improve docstrings.
r3435 gothist = ip.history_manager.get_tail(2)
Thomas Kluyver
Further refinements to history interfaces.
r3420 expected = [(2, 1, newcmds[0]),
(2, 2, newcmds[1])]
nt.assert_equal(list(gothist), expected)
Thomas Kluyver
Simplify magic_history display code, allow get_hist_search to include output in return values, and add some unit tests.
r3400 # Check get_hist_search
Thomas Kluyver
Rename history retrieval methods, and improve docstrings.
r3435 gothist = ip.history_manager.search("*test*")
Thomas Kluyver
Simplify magic_history display code, allow get_hist_search to include output in return values, and add some unit tests.
r3400 nt.assert_equal(list(gothist), [(1,2,hist[1])] )
Thomas Kluyver
Rename history retrieval methods, and improve docstrings.
r3435 gothist = ip.history_manager.search("b*", output=True)
Thomas Kluyver
Separate 'Out' in user_ns from the output history logging.
r3417 nt.assert_equal(list(gothist), [(1,3,(hist[2],["spam"]))] )
Thomas Kluyver
Simplify magic_history display code, allow get_hist_search to include output in return values, and add some unit tests.
r3400
Thomas Kluyver
Passing IPython.core tests.
r3396 # Cross testing: check that magic %save can get previous session.
Thomas Kluyver
Add test code for history session offset.
r3383 testfilename = os.path.realpath(os.path.join(tmpdir, "test.py"))
Thomas Kluyver
Passing IPython.core tests.
r3396 ip.magic_save(testfilename + " ~1/1-3")
Thomas Kluyver
Add test code for history session offset.
r3383 testfile = open(testfilename, "r")
Thomas Kluyver
Fix up so tests pass again. input_splitter now uses ast module instead of compiler, bringing it closer to the Python 3 implementation.
r3454 nt.assert_equal(testfile.read().decode("utf-8"),
"# coding: utf-8\n" + "\n".join(hist))
Thomas Kluyver
Add test code to make sure that history database errors caused by duplicate session/line numbers are handled correctly (don't crash, get new session).
r3438
# Duplicate line numbers - check that it doesn't crash, and
# gets a new session
ip.history_manager.store_inputs(1, "rogue")
nt.assert_equal(ip.history_manager.session_number, 3)
Satrajit Ghosh
History refactored and saved to json file...
r3240 finally:
# Restore history manager
ip.history_manager = hist_manager_ori
Thomas Kluyver
Passing IPython.core tests.
r3396
Thomas Kluyver
Moved unicode tests into main test suite. Reverified that both fail if the fixes in previous commits are undone.
r3447
Thomas Kluyver
Passing IPython.core tests.
r3396 def test_extract_hist_ranges():
instr = "1 2/3 ~4/5-6 ~4/7-~4/9 ~9/2-~7/5"
expected = [(0, 1, 2), # 0 == current session
(2, 3, 4),
(-4, 5, 7),
(-4, 7, 10),
(-9, 2, None), # None == to end
(-8, 1, None),
(-7, 1, 6)]
actual = list(extract_hist_ranges(instr))
nt.assert_equal(actual, expected)
Thomas Kluyver
Further refinements to history interfaces.
r3420
def test_magic_rerun():
"""Simple test for %rerun (no args -> rerun last line)"""
ip = get_ipython()
ip.run_cell("a = 10")
ip.run_cell("a += 1")
nt.assert_equal(ip.user_ns["a"], 11)
ip.run_cell("%rerun")
nt.assert_equal(ip.user_ns["a"], 12)