import unittest
from dm_sql_contract import ident,literal,numeric,value_sql,target_type,default_sql
class Contract(unittest.TestCase):
 def test_escaping(self):self.assertEqual(literal("x'\\\n&"),"'x''\\'||CHR(10)||'&'")
 def test_empty_null(self):self.assertEqual(literal(''),"''");self.assertEqual(literal(None),'NULL')
 def test_precision(self):self.assertEqual(numeric('18446744073709551615'),'18446744073709551615')
 def test_injection(self):
  for v in ('1;DROP TABLE T','NaN','inf'):
   with self.assertRaises(ValueError):numeric(v)
 def test_identifier(self):self.assertEqual(ident('a_b'),'"A_B"')
 def test_zero_date_rejected(self):
  with self.assertRaises(ValueError):value_sql({'DATA_TYPE':'datetime'},'2026-00-01 00:00:00')
 def test_unsigned_bigint(self):self.assertEqual(target_type({'DATA_TYPE':'bigint','COLUMN_TYPE':'bigint unsigned'}),'DECIMAL(20,0)')
 def test_char_unit(self):self.assertEqual(target_type({'DATA_TYPE':'varchar','COLUMN_TYPE':'varchar(50)','CHARACTER_MAXIMUM_LENGTH':50}),'VARCHAR(50 CHAR)')
 def test_timestamp_default(self):self.assertEqual(default_sql({'COLUMN_DEFAULT':'CURRENT_TIMESTAMP','EXTRA':'DEFAULT_GENERATED','DATA_TYPE':'datetime'}),' DEFAULT CURRENT_TIMESTAMP')
 def test_timestamp_millisecond_default(self):self.assertEqual(default_sql({'COLUMN_DEFAULT':'CURRENT_TIMESTAMP(3)','EXTRA':'DEFAULT_GENERATED','DATA_TYPE':'datetime'}),' DEFAULT CURRENT_TIMESTAMP(3)')
if __name__=='__main__':unittest.main()
