def test_validate_neighbors(self):
        # cases with none
        with self.subTest():
            self.assertTrue(EP.validate_neighbors(None, 'p', '+')[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors(None, '~', 'p')[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors(None, '~', '(')[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors(None, '(', 'p')[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('*', 'p', None)[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('~', 'p', None)[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('p', ')', None)[0])

        # basic valid cases
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('p', '+', 'q')[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('p', '*', 'q')[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('p', '>', 'q')[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('p', '=', 'q')[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('~', 'p', '+')[0])
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('(', 'p', ')')[0])

        # double negation is valid
        with self.subTest():
            self.assertTrue(EP.validate_neighbors('~', '~', 'p')[0])

        # invalid cases
        # double vars
        with self.subTest():
            self.assertFalse(EP.validate_neighbors('p', 'q', '+')[0])
        with self.subTest():
            self.assertFalse(EP.validate_neighbors('+', 'p', 'q')[0])

        # double binary ops
        with self.subTest():
            self.assertFalse(EP.validate_neighbors('+', '>', 'q')[0])
        with self.subTest():
            self.assertFalse(EP.validate_neighbors('p', '=', '+')[0])

        # invalid parens
        with self.subTest():
            self.assertFalse(EP.validate_neighbors(')', '(', 'p')[0])
        with self.subTest():  # empty parens is bad
            self.assertFalse(EP.validate_neighbors('(', ')', 'p')[0])
        with self.subTest():
            self.assertFalse(EP.validate_neighbors('p', '(', ')')[0])
        with self.subTest():
            self.assertFalse(EP.validate_neighbors('p', ')', '(')[0])
        with self.subTest():
            self.assertFalse(EP.validate_neighbors(')', '~', 'p')[0])
        with self.subTest():
            self.assertFalse(EP.validate_neighbors('(', '>', 'p')[0])

        # unlcosed parens
        with self.subTest():
            self.assertFalse(EP.validate_neighbors('~', '(', None)[0])
        with self.subTest():
            self.assertFalse(EP.validate_neighbors(None, ')', '*')[0])