import testsamples
import test_engine

class TestFindCol(test_engine.EngineTestCase):
  def test_find_col_from_values(self):
    # Test basic functionality.
    self.load_sample(testsamples.sample_students)
    self.assertEqual(self.engine.find_col_from_values(("Columbia", "Yale", "Eureka"), 0),
        [4, 10])
    self.assertEqual(self.engine.find_col_from_values(("Columbia", "Yale", "Eureka"), 1),
        [4])
    self.assertEqual(self.engine.find_col_from_values(["Yale"], 2),
        [10, 4])
    self.assertEqual(self.engine.find_col_from_values(("Columbia", "Yale", "Eureka"), 0, "Schools"),
        [10])

  def test_find_col_with_nonhashable(self):
    self.load_sample(testsamples.sample_students)
    # Add a couple of columns returning list, which is not hashable. There used to be a bug where
    # non-hashable values would cause an exception.
    self.add_column("Students", "foo", formula="list(Schools.lookupRecords(name=$schoolName))")

    # This column returns a non-hashable value, but is otherwise the best match.
    self.add_column("Students", "bar", formula=
        "[1,2,3] if $firstName == 'Bill' else $schoolName.lower()")

    # Check the columns are added with expected colRefs
    self.assertTableData('_grist_Tables_column', cols="subset", rows="subset", data=[
      ["id",  "colId", "type",  "isFormula" ],
      [22,    "foo",   "Any",   True        ],
      [23,    "bar",   "Any",   True        ],
      ])
    self.assertTableData("Students", cols="subset", data=[
      ["id","firstName","lastName", "schoolName", "bar",      ],
      [1,   "Barack",   "Obama",    "Columbia",   "columbia"  ],
      [2,   "George W", "Bush",     "Yale",       "yale"      ],
      [3,   "Bill",     "Clinton",  "Columbia",   [1,2,3]     ],
      [4,   "George H", "Bush",     "Yale",       "yale"      ],
      [5,   "Ronald",   "Reagan",   "Eureka",     "eureka"    ],
      [6,   "Gerald",   "Ford",     "Yale",       "yale"      ],
    ])

    self.assertEqual(self.engine.find_col_from_values(("Columbia", "Yale", "Eureka"), 0), [4, 10])
    self.assertEqual(self.engine.find_col_from_values(("columbia", "yale", "Eureka"), 0), [23, 4])

    # Test that it's safe to include a non-hashable value in the request.
    self.assertEqual(self.engine.find_col_from_values(("columbia", "yale", ["Eureka"]), 0), [23])