| 1 | #-*- coding: ISO-8859-1 -*-
|
|---|
| 2 | # pysqlite2/test/hooks.py: tests for various SQLite-specific hooks
|
|---|
| 3 | #
|
|---|
| 4 | # Copyright (C) 2006 Gerhard Häring <[email protected]>
|
|---|
| 5 | #
|
|---|
| 6 | # This file is part of pysqlite.
|
|---|
| 7 | #
|
|---|
| 8 | # This software is provided 'as-is', without any express or implied
|
|---|
| 9 | # warranty. In no event will the authors be held liable for any damages
|
|---|
| 10 | # arising from the use of this software.
|
|---|
| 11 | #
|
|---|
| 12 | # Permission is granted to anyone to use this software for any purpose,
|
|---|
| 13 | # including commercial applications, and to alter it and redistribute it
|
|---|
| 14 | # freely, subject to the following restrictions:
|
|---|
| 15 | #
|
|---|
| 16 | # 1. The origin of this software must not be misrepresented; you must not
|
|---|
| 17 | # claim that you wrote the original software. If you use this software
|
|---|
| 18 | # in a product, an acknowledgment in the product documentation would be
|
|---|
| 19 | # appreciated but is not required.
|
|---|
| 20 | # 2. Altered source versions must be plainly marked as such, and must not be
|
|---|
| 21 | # misrepresented as being the original software.
|
|---|
| 22 | # 3. This notice may not be removed or altered from any source distribution.
|
|---|
| 23 |
|
|---|
| 24 | import os, unittest
|
|---|
| 25 | import sqlite3 as sqlite
|
|---|
| 26 |
|
|---|
| 27 | class CollationTests(unittest.TestCase):
|
|---|
| 28 | def setUp(self):
|
|---|
| 29 | pass
|
|---|
| 30 |
|
|---|
| 31 | def tearDown(self):
|
|---|
| 32 | pass
|
|---|
| 33 |
|
|---|
| 34 | def CheckCreateCollationNotCallable(self):
|
|---|
| 35 | con = sqlite.connect(":memory:")
|
|---|
| 36 | try:
|
|---|
| 37 | con.create_collation("X", 42)
|
|---|
| 38 | self.fail("should have raised a TypeError")
|
|---|
| 39 | except TypeError, e:
|
|---|
| 40 | self.failUnlessEqual(e.args[0], "parameter must be callable")
|
|---|
| 41 |
|
|---|
| 42 | def CheckCreateCollationNotAscii(self):
|
|---|
| 43 | con = sqlite.connect(":memory:")
|
|---|
| 44 | try:
|
|---|
| 45 | con.create_collation("collä", cmp)
|
|---|
| 46 | self.fail("should have raised a ProgrammingError")
|
|---|
| 47 | except sqlite.ProgrammingError, e:
|
|---|
| 48 | pass
|
|---|
| 49 |
|
|---|
| 50 | def CheckCollationIsUsed(self):
|
|---|
| 51 | if sqlite.version_info < (3, 2, 1): # old SQLite versions crash on this test
|
|---|
| 52 | return
|
|---|
| 53 | def mycoll(x, y):
|
|---|
| 54 | # reverse order
|
|---|
| 55 | return -cmp(x, y)
|
|---|
| 56 |
|
|---|
| 57 | con = sqlite.connect(":memory:")
|
|---|
| 58 | con.create_collation("mycoll", mycoll)
|
|---|
| 59 | sql = """
|
|---|
| 60 | select x from (
|
|---|
| 61 | select 'a' as x
|
|---|
| 62 | union
|
|---|
| 63 | select 'b' as x
|
|---|
| 64 | union
|
|---|
| 65 | select 'c' as x
|
|---|
| 66 | ) order by x collate mycoll
|
|---|
| 67 | """
|
|---|
| 68 | result = con.execute(sql).fetchall()
|
|---|
| 69 | if result[0][0] != "c" or result[1][0] != "b" or result[2][0] != "a":
|
|---|
| 70 | self.fail("the expected order was not returned")
|
|---|
| 71 |
|
|---|
| 72 | con.create_collation("mycoll", None)
|
|---|
|
|---|