test_var_operations.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. """Integration tests for var operations."""
  2. from typing import Generator
  3. import pytest
  4. from selenium.webdriver.common.by import By
  5. from reflex.testing import AppHarness
  6. # pyright: reportOptionalMemberAccess=false, reportGeneralTypeIssues=false, reportUnknownMemberType=false
  7. def VarOperations():
  8. """App with var operations."""
  9. import reflex as rx
  10. class VarOperationState(rx.State):
  11. int_var1: int = 10
  12. int_var2: int = 5
  13. int_var3: int = 7
  14. float_var1: float = 10.5
  15. float_var2: float = 5.5
  16. list1: list = [1, 2]
  17. list2: list = [3, 4]
  18. list3: list = ["first", "second", "third"]
  19. str_var1: str = "first"
  20. str_var2: str = "second"
  21. str_var3: str = "ThIrD"
  22. str_var4: str = "a long string"
  23. dict1: dict = {1: 2}
  24. dict2: dict = {3: 4}
  25. app = rx.App(state=VarOperationState)
  26. @app.add_page
  27. def index():
  28. return rx.vstack(
  29. rx.input(
  30. id="token",
  31. value=VarOperationState.router.session.client_token,
  32. is_read_only=True,
  33. ),
  34. # INT INT
  35. rx.text(
  36. VarOperationState.int_var1 + VarOperationState.int_var2,
  37. id="int_add_int",
  38. ),
  39. rx.text(
  40. VarOperationState.int_var1 * VarOperationState.int_var2,
  41. id="int_mult_int",
  42. ),
  43. rx.text(
  44. VarOperationState.int_var1 - VarOperationState.int_var2,
  45. id="int_sub_int",
  46. ),
  47. rx.text(
  48. VarOperationState.int_var1**VarOperationState.int_var2,
  49. id="int_exp_int",
  50. ),
  51. rx.text(
  52. VarOperationState.int_var1 / VarOperationState.int_var2,
  53. id="int_div_int",
  54. ),
  55. rx.text(
  56. VarOperationState.int_var1 // VarOperationState.int_var3,
  57. id="int_floor_int",
  58. ),
  59. rx.text(
  60. VarOperationState.int_var1 % VarOperationState.int_var2,
  61. id="int_mod_int",
  62. ),
  63. rx.text(
  64. VarOperationState.int_var1 | VarOperationState.int_var2,
  65. id="int_or_int",
  66. ),
  67. rx.text(
  68. (VarOperationState.int_var1 > VarOperationState.int_var2).to_string(),
  69. id="int_gt_int",
  70. ),
  71. rx.text(
  72. (VarOperationState.int_var1 < VarOperationState.int_var2).to_string(),
  73. id="int_lt_int",
  74. ),
  75. rx.text(
  76. (VarOperationState.int_var1 >= VarOperationState.int_var2).to_string(),
  77. id="int_gte_int",
  78. ),
  79. rx.text(
  80. (VarOperationState.int_var1 <= VarOperationState.int_var2).to_string(),
  81. id="int_lte_int",
  82. ),
  83. rx.text(
  84. VarOperationState.int_var1 & VarOperationState.int_var2,
  85. id="int_and_int",
  86. ),
  87. rx.text(
  88. (VarOperationState.int_var1 | VarOperationState.int_var2).to_string(),
  89. id="int_or_int",
  90. ),
  91. rx.text(
  92. (VarOperationState.int_var1 == VarOperationState.int_var2).to_string(),
  93. id="int_eq_int",
  94. ),
  95. rx.text(
  96. (VarOperationState.int_var1 != VarOperationState.int_var2).to_string(),
  97. id="int_neq_int",
  98. ),
  99. # INT FLOAT OR FLOAT INT
  100. rx.text(
  101. VarOperationState.float_var1 + VarOperationState.int_var2,
  102. id="float_add_int",
  103. ),
  104. rx.text(
  105. VarOperationState.float_var1 * VarOperationState.int_var2,
  106. id="float_mult_int",
  107. ),
  108. rx.text(
  109. VarOperationState.float_var1 - VarOperationState.int_var2,
  110. id="float_sub_int",
  111. ),
  112. rx.text(
  113. VarOperationState.float_var1**VarOperationState.int_var2,
  114. id="float_exp_int",
  115. ),
  116. rx.text(
  117. VarOperationState.float_var1 / VarOperationState.int_var2,
  118. id="float_div_int",
  119. ),
  120. rx.text(
  121. VarOperationState.float_var1 // VarOperationState.int_var3,
  122. id="float_floor_int",
  123. ),
  124. rx.text(
  125. VarOperationState.float_var1 % VarOperationState.int_var2,
  126. id="float_mod_int",
  127. ),
  128. rx.text(
  129. (VarOperationState.float_var1 > VarOperationState.int_var2).to_string(),
  130. id="float_gt_int",
  131. ),
  132. rx.text(
  133. (VarOperationState.float_var1 < VarOperationState.int_var2).to_string(),
  134. id="float_lt_int",
  135. ),
  136. rx.text(
  137. (
  138. VarOperationState.float_var1 >= VarOperationState.int_var2
  139. ).to_string(),
  140. id="float_gte_int",
  141. ),
  142. rx.text(
  143. (
  144. VarOperationState.float_var1 <= VarOperationState.int_var2
  145. ).to_string(),
  146. id="float_lte_int",
  147. ),
  148. rx.text(
  149. (
  150. VarOperationState.float_var1 == VarOperationState.int_var2
  151. ).to_string(),
  152. id="float_eq_int",
  153. ),
  154. rx.text(
  155. (
  156. VarOperationState.float_var1 != VarOperationState.int_var2
  157. ).to_string(),
  158. id="float_neq_int",
  159. ),
  160. rx.text(
  161. (VarOperationState.float_var1 & VarOperationState.int_var2).to_string(),
  162. id="float_and_int",
  163. ),
  164. rx.text(
  165. (VarOperationState.float_var1 | VarOperationState.int_var2).to_string(),
  166. id="float_or_int",
  167. ),
  168. # INT, DICT
  169. rx.text(
  170. (VarOperationState.int_var1 | VarOperationState.dict1).to_string(),
  171. id="int_or_dict",
  172. ),
  173. rx.text(
  174. (VarOperationState.int_var1 & VarOperationState.dict1).to_string(),
  175. id="int_and_dict",
  176. ),
  177. rx.text(
  178. (VarOperationState.int_var1 == VarOperationState.dict1).to_string(),
  179. id="int_eq_dict",
  180. ),
  181. rx.text(
  182. (VarOperationState.int_var1 != VarOperationState.dict1).to_string(),
  183. id="int_neq_dict",
  184. ),
  185. # FLOAT FLOAT
  186. rx.text(
  187. VarOperationState.float_var1 + VarOperationState.float_var2,
  188. id="float_add_float",
  189. ),
  190. rx.text(
  191. VarOperationState.float_var1 * VarOperationState.float_var2,
  192. id="float_mult_float",
  193. ),
  194. rx.text(
  195. VarOperationState.float_var1 - VarOperationState.float_var2,
  196. id="float_sub_float",
  197. ),
  198. rx.text(
  199. VarOperationState.float_var1**VarOperationState.float_var2,
  200. id="float_exp_float",
  201. ),
  202. rx.text(
  203. VarOperationState.float_var1 / VarOperationState.float_var2,
  204. id="float_div_float",
  205. ),
  206. rx.text(
  207. VarOperationState.float_var1 // VarOperationState.float_var2,
  208. id="float_floor_float",
  209. ),
  210. rx.text(
  211. VarOperationState.float_var1 % VarOperationState.float_var2,
  212. id="float_mod_float",
  213. ),
  214. rx.text(
  215. (
  216. VarOperationState.float_var1 > VarOperationState.float_var2
  217. ).to_string(),
  218. id="float_gt_float",
  219. ),
  220. rx.text(
  221. (
  222. VarOperationState.float_var1 < VarOperationState.float_var2
  223. ).to_string(),
  224. id="float_lt_float",
  225. ),
  226. rx.text(
  227. (
  228. VarOperationState.float_var1 >= VarOperationState.float_var2
  229. ).to_string(),
  230. id="float_gte_float",
  231. ),
  232. rx.text(
  233. (
  234. VarOperationState.float_var1 <= VarOperationState.float_var2
  235. ).to_string(),
  236. id="float_lte_float",
  237. ),
  238. rx.text(
  239. (
  240. VarOperationState.float_var1 == VarOperationState.float_var2
  241. ).to_string(),
  242. id="float_eq_float",
  243. ),
  244. rx.text(
  245. (
  246. VarOperationState.float_var1 != VarOperationState.float_var2
  247. ).to_string(),
  248. id="float_neq_float",
  249. ),
  250. rx.text(
  251. (
  252. VarOperationState.float_var1 & VarOperationState.float_var2
  253. ).to_string(),
  254. id="float_and_float",
  255. ),
  256. rx.text(
  257. (
  258. VarOperationState.float_var1 | VarOperationState.float_var2
  259. ).to_string(),
  260. id="float_or_float",
  261. ),
  262. # FLOAT STR
  263. rx.text(
  264. VarOperationState.float_var1 | VarOperationState.str_var1,
  265. id="float_or_str",
  266. ),
  267. rx.text(
  268. VarOperationState.float_var1 & VarOperationState.str_var1,
  269. id="float_and_str",
  270. ),
  271. rx.text(
  272. (
  273. VarOperationState.float_var1 == VarOperationState.str_var1
  274. ).to_string(),
  275. id="float_eq_str",
  276. ),
  277. rx.text(
  278. (
  279. VarOperationState.float_var1 != VarOperationState.str_var1
  280. ).to_string(),
  281. id="float_neq_str",
  282. ),
  283. # FLOAT LIST
  284. rx.text(
  285. (VarOperationState.float_var1 | VarOperationState.list1).to_string(),
  286. id="float_or_list",
  287. ),
  288. rx.text(
  289. (VarOperationState.float_var1 & VarOperationState.list1).to_string(),
  290. id="float_and_list",
  291. ),
  292. rx.text(
  293. (VarOperationState.float_var1 == VarOperationState.list1).to_string(),
  294. id="float_eq_list",
  295. ),
  296. rx.text(
  297. (VarOperationState.float_var1 != VarOperationState.list1).to_string(),
  298. id="float_neq_list",
  299. ),
  300. # FLOAT DICT
  301. rx.text(
  302. (VarOperationState.float_var1 | VarOperationState.dict1).to_string(),
  303. id="float_or_dict",
  304. ),
  305. rx.text(
  306. (VarOperationState.float_var1 & VarOperationState.dict1).to_string(),
  307. id="float_and_dict",
  308. ),
  309. rx.text(
  310. (VarOperationState.float_var1 == VarOperationState.dict1).to_string(),
  311. id="float_eq_dict",
  312. ),
  313. rx.text(
  314. (VarOperationState.float_var1 != VarOperationState.dict1).to_string(),
  315. id="float_neq_dict",
  316. ),
  317. # STR STR
  318. rx.text(
  319. VarOperationState.str_var1 + VarOperationState.str_var2,
  320. id="str_add_str",
  321. ),
  322. rx.text(
  323. (VarOperationState.str_var1 > VarOperationState.str_var2).to_string(),
  324. id="str_gt_str",
  325. ),
  326. rx.text(
  327. (VarOperationState.str_var1 < VarOperationState.str_var2).to_string(),
  328. id="str_lt_str",
  329. ),
  330. rx.text(
  331. (VarOperationState.str_var1 >= VarOperationState.str_var2).to_string(),
  332. id="str_gte_str",
  333. ),
  334. rx.text(
  335. (VarOperationState.str_var1 <= VarOperationState.str_var2).to_string(),
  336. id="str_lte_str",
  337. ),
  338. rx.text(
  339. (
  340. VarOperationState.float_var1 == VarOperationState.float_var2
  341. ).to_string(),
  342. id="str_eq_str",
  343. ),
  344. rx.text(
  345. (
  346. VarOperationState.float_var1 != VarOperationState.float_var2
  347. ).to_string(),
  348. id="str_neq_str",
  349. ),
  350. rx.text(
  351. VarOperationState.str_var1.contains("fir").to_string(),
  352. id="str_contains",
  353. ),
  354. rx.text(
  355. VarOperationState.str_var1 | VarOperationState.str_var1, id="str_or_str"
  356. ),
  357. rx.text(
  358. VarOperationState.str_var1 & VarOperationState.str_var2,
  359. id="str_and_str",
  360. ),
  361. # STR, INT
  362. rx.text(
  363. VarOperationState.str_var1 * VarOperationState.int_var2,
  364. id="str_mult_int",
  365. ),
  366. rx.text(
  367. VarOperationState.str_var1 & VarOperationState.int_var2,
  368. id="str_and_int",
  369. ),
  370. rx.text(
  371. VarOperationState.str_var1 | VarOperationState.int_var2, id="str_or_int"
  372. ),
  373. rx.text(
  374. (VarOperationState.str_var1 == VarOperationState.int_var1).to_string(),
  375. id="str_eq_int",
  376. ),
  377. rx.text(
  378. (VarOperationState.str_var1 != VarOperationState.int_var1).to_string(),
  379. id="str_neq_int",
  380. ),
  381. # STR, LIST
  382. rx.text(
  383. VarOperationState.str_var1 | VarOperationState.list1, id="str_or_list"
  384. ),
  385. rx.text(
  386. (VarOperationState.str_var1 & VarOperationState.list1).to_string(),
  387. id="str_and_list",
  388. ),
  389. rx.text(
  390. (VarOperationState.str_var1 == VarOperationState.list1).to_string(),
  391. id="str_eq_list",
  392. ),
  393. rx.text(
  394. (VarOperationState.str_var1 != VarOperationState.list1).to_string(),
  395. id="str_neq_list",
  396. ),
  397. # STR, DICT
  398. rx.text(
  399. VarOperationState.str_var1 | VarOperationState.dict1, id="str_or_dict"
  400. ),
  401. rx.text(
  402. (VarOperationState.str_var1 & VarOperationState.dict1).to_string(),
  403. id="str_and_dict",
  404. ),
  405. rx.text(
  406. (VarOperationState.str_var1 == VarOperationState.dict1).to_string(),
  407. id="str_eq_dict",
  408. ),
  409. rx.text(
  410. (VarOperationState.str_var1 != VarOperationState.dict1).to_string(),
  411. id="str_neq_dict",
  412. ),
  413. # LIST, LIST
  414. rx.text(
  415. (VarOperationState.list1 + VarOperationState.list2).to_string(),
  416. id="list_add_list",
  417. ),
  418. rx.text(
  419. (VarOperationState.list1 & VarOperationState.list2).to_string(),
  420. id="list_and_list",
  421. ),
  422. rx.text(
  423. (VarOperationState.list1 | VarOperationState.list2).to_string(),
  424. id="list_or_list",
  425. ),
  426. rx.text(
  427. (VarOperationState.list1 > VarOperationState.list2).to_string(),
  428. id="list_gt_list",
  429. ),
  430. rx.text(
  431. (VarOperationState.list1 < VarOperationState.list2).to_string(),
  432. id="list_lt_list",
  433. ),
  434. rx.text(
  435. (VarOperationState.list1 >= VarOperationState.list2).to_string(),
  436. id="list_gte_list",
  437. ),
  438. rx.text(
  439. (VarOperationState.list1 <= VarOperationState.list2).to_string(),
  440. id="list_lte_list",
  441. ),
  442. rx.text(
  443. (VarOperationState.list1 == VarOperationState.list2).to_string(),
  444. id="list_eq_list",
  445. ),
  446. rx.text(
  447. (VarOperationState.list1 != VarOperationState.list2).to_string(),
  448. id="list_neq_list",
  449. ),
  450. rx.text(
  451. VarOperationState.list1.contains(1).to_string(), id="list_contains"
  452. ),
  453. rx.text(VarOperationState.list1.reverse().to_string(), id="list_reverse"),
  454. # LIST, INT
  455. rx.text(
  456. (VarOperationState.list1 * VarOperationState.int_var2).to_string(),
  457. id="list_mult_int",
  458. ),
  459. rx.text(
  460. (VarOperationState.list1 | VarOperationState.int_var1).to_string(),
  461. id="list_or_int",
  462. ),
  463. rx.text(
  464. (VarOperationState.list1 & VarOperationState.int_var1).to_string(),
  465. id="list_and_int",
  466. ),
  467. rx.text(
  468. (VarOperationState.list1 == VarOperationState.int_var1).to_string(),
  469. id="list_eq_int",
  470. ),
  471. rx.text(
  472. (VarOperationState.list1 != VarOperationState.int_var1).to_string(),
  473. id="list_neq_int",
  474. ),
  475. # LIST, DICT
  476. rx.text(
  477. (VarOperationState.list1 | VarOperationState.dict1).to_string(),
  478. id="list_or_dict",
  479. ),
  480. rx.text(
  481. (VarOperationState.list1 & VarOperationState.dict1).to_string(),
  482. id="list_and_dict",
  483. ),
  484. rx.text(
  485. (VarOperationState.list1 == VarOperationState.dict1).to_string(),
  486. id="list_eq_dict",
  487. ),
  488. rx.text(
  489. (VarOperationState.list1 != VarOperationState.dict1).to_string(),
  490. id="list_neq_dict",
  491. ),
  492. # DICT, DICT
  493. rx.text(
  494. (VarOperationState.dict1 | VarOperationState.dict2).to_string(),
  495. id="dict_or_dict",
  496. ),
  497. rx.text(
  498. (VarOperationState.dict1 & VarOperationState.dict2).to_string(),
  499. id="dict_and_dict",
  500. ),
  501. rx.text(
  502. (VarOperationState.dict1 == VarOperationState.dict2).to_string(),
  503. id="dict_eq_dict",
  504. ),
  505. rx.text(
  506. (VarOperationState.dict1 != VarOperationState.dict2).to_string(),
  507. id="dict_neq_dict",
  508. ),
  509. rx.text(
  510. VarOperationState.dict1.contains(1).to_string(), id="dict_contains"
  511. ),
  512. rx.text(VarOperationState.str_var3.lower(), id="str_lower"),
  513. rx.text(VarOperationState.str_var3.upper(), id="str_upper"),
  514. rx.text(VarOperationState.str_var4.split(" ").to_string(), id="str_split"),
  515. rx.text(VarOperationState.list3.join(""), id="list_join"),
  516. rx.text(VarOperationState.list3.join(","), id="list_join_comma"),
  517. )
  518. app.compile()
  519. @pytest.fixture(scope="session")
  520. def var_operations(tmp_path_factory) -> Generator[AppHarness, None, None]:
  521. """Start VarOperations app at tmp_path via AppHarness.
  522. Args:
  523. tmp_path_factory: pytest tmp_path_factory fixture
  524. Yields:
  525. running AppHarness instance
  526. """
  527. with AppHarness.create(
  528. root=tmp_path_factory.mktemp("var_operations"),
  529. app_source=VarOperations, # type: ignore
  530. ) as harness:
  531. assert harness.app_instance is not None, "app is not running"
  532. yield harness
  533. @pytest.fixture
  534. def driver(var_operations: AppHarness):
  535. """Get an instance of the browser open to the var operations app.
  536. Args:
  537. var_operations: harness for VarOperations app
  538. Yields:
  539. WebDriver instance.
  540. """
  541. driver = var_operations.frontend()
  542. try:
  543. token_input = driver.find_element(By.ID, "token")
  544. assert token_input
  545. # wait for the backend connection to send the token
  546. token = var_operations.poll_for_value(token_input)
  547. assert token is not None
  548. yield driver
  549. finally:
  550. driver.quit()
  551. def test_var_operations(driver, var_operations: AppHarness):
  552. """Test that the var operations produce the right results.
  553. Args:
  554. driver: selenium WebDriver open to the app
  555. var_operations: AppHarness for the var operations app
  556. """
  557. tests = [
  558. # int, int
  559. ("int_add_int", "15"),
  560. ("int_mult_int", "50"),
  561. ("int_sub_int", "5"),
  562. ("int_exp_int", "100000"),
  563. ("int_div_int", "2"),
  564. ("int_floor_int", "1"),
  565. ("int_mod_int", "0"),
  566. ("int_gt_int", "true"),
  567. ("int_lt_int", "false"),
  568. ("int_gte_int", "true"),
  569. ("int_lte_int", "false"),
  570. ("int_and_int", "5"),
  571. ("int_or_int", "10"),
  572. ("int_eq_int", "false"),
  573. ("int_neq_int", "true"),
  574. # int, float
  575. ("float_add_int", "15.5"),
  576. ("float_mult_int", "52.5"),
  577. ("float_sub_int", "5.5"),
  578. ("float_exp_int", "127628.15625"),
  579. ("float_div_int", "2.1"),
  580. ("float_floor_int", "1"),
  581. ("float_mod_int", "0.5"),
  582. ("float_gt_int", "true"),
  583. ("float_lt_int", "false"),
  584. ("float_gte_int", "true"),
  585. ("float_lte_int", "false"),
  586. ("float_eq_int", "false"),
  587. ("float_neq_int", "true"),
  588. ("float_and_int", "5"),
  589. ("float_or_int", "10.5"),
  590. # int, dict
  591. ("int_or_dict", "10"),
  592. ("int_and_dict", '{"1":2}'),
  593. ("int_eq_dict", "false"),
  594. ("int_neq_dict", "true"),
  595. # float, float
  596. ("float_add_float", "16"),
  597. ("float_mult_float", "57.75"),
  598. ("float_sub_float", "5"),
  599. ("float_exp_float", "413562.49323606625"),
  600. ("float_div_float", "1.9090909090909092"),
  601. ("float_floor_float", "1"),
  602. ("float_mod_float", "5"),
  603. ("float_gt_float", "true"),
  604. ("float_lt_float", "false"),
  605. ("float_gte_float", "true"),
  606. ("float_lte_float", "false"),
  607. ("float_eq_float", "false"),
  608. ("float_neq_float", "true"),
  609. ("float_and_float", "5.5"),
  610. ("float_or_float", "10.5"),
  611. # float, str
  612. ("float_or_str", "10.5"),
  613. ("float_and_str", "first"),
  614. ("float_eq_str", "false"),
  615. ("float_neq_str", "true"),
  616. # float, list
  617. ("float_or_list", "10.5"),
  618. ("float_and_list", "[1,2]"),
  619. ("float_eq_list", "false"),
  620. ("float_neq_list", "true"),
  621. # float, dict
  622. ("float_or_dict", "10.5"),
  623. ("float_and_dict", '{"1":2}'),
  624. ("float_eq_dict", "false"),
  625. ("float_neq_dict", "true"),
  626. # str, str
  627. ("str_add_str", "firstsecond"),
  628. ("str_gt_str", "false"),
  629. ("str_lt_str", "true"),
  630. ("str_gte_str", "false"),
  631. ("str_lte_str", "true"),
  632. ("str_eq_str", "false"),
  633. ("str_neq_str", "true"),
  634. ("str_and_str", "second"),
  635. ("str_or_str", "first"),
  636. ("str_contains", "true"),
  637. ("str_lower", "third"),
  638. ("str_upper", "THIRD"),
  639. ("str_split", '["a","long","string"]'),
  640. # str, int
  641. ("str_mult_int", "firstfirstfirstfirstfirst"),
  642. ("str_and_int", "5"),
  643. ("str_or_int", "first"),
  644. ("str_eq_int", "false"),
  645. ("str_neq_int", "true"),
  646. # str, list
  647. ("str_and_list", "[1,2]"),
  648. ("str_or_list", "first"),
  649. ("str_eq_list", "false"),
  650. ("str_neq_list", "true"),
  651. # str, dict
  652. ("str_or_dict", "first"),
  653. ("str_and_dict", '{"1":2}'),
  654. ("str_eq_dict", "false"),
  655. ("str_neq_dict", "true"),
  656. # list, list
  657. ("list_add_list", "[1,2,3,4]"),
  658. ("list_gt_list", "false"),
  659. ("list_lt_list", "true"),
  660. ("list_gte_list", "false"),
  661. ("list_lte_list", "true"),
  662. ("list_eq_list", "false"),
  663. ("list_neq_list", "true"),
  664. ("list_and_list", "[3,4]"),
  665. ("list_or_list", "[1,2]"),
  666. ("list_contains", "true"),
  667. ("list_reverse", "[2,1]"),
  668. ("list_join", "firstsecondthird"),
  669. ("list_join_comma", "first,second,third"),
  670. # list, int
  671. ("list_mult_int", "[1,2,1,2,1,2,1,2,1,2]"),
  672. ("list_or_int", "[1,2]"),
  673. ("list_and_int", "10"),
  674. ("list_eq_int", "false"),
  675. ("list_neq_int", "true"),
  676. # list, dict
  677. ("list_and_dict", '{"1":2}'),
  678. ("list_or_dict", "[1,2]"),
  679. ("list_eq_dict", "false"),
  680. ("list_neq_dict", "true"),
  681. # dict, dict
  682. ("dict_or_dict", '{"1":2}'),
  683. ("dict_and_dict", '{"3":4}'),
  684. ("dict_eq_dict", "false"),
  685. ("dict_neq_dict", "true"),
  686. ("dict_contains", "true"),
  687. ]
  688. for tag, expected in tests:
  689. assert driver.find_element(By.ID, tag).text == expected