Function.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. use js_sys::*;
  2. use wasm_bindgen::prelude::*;
  3. use wasm_bindgen::JsCast;
  4. use wasm_bindgen_test::*;
  5. #[wasm_bindgen]
  6. extern "C" {
  7. #[wasm_bindgen(js_name = max, js_namespace = Math)]
  8. static MAX: Function;
  9. type ArrayPrototype;
  10. #[wasm_bindgen(method, getter, structural)]
  11. pub fn push(this: &ArrayPrototype) -> Function;
  12. #[wasm_bindgen(js_name = prototype, js_namespace = Array)]
  13. static ARRAY_PROTOTYPE2: ArrayPrototype;
  14. }
  15. #[wasm_bindgen_test]
  16. fn apply() {
  17. let args = Array::new();
  18. args.push(&1.into());
  19. args.push(&2.into());
  20. args.push(&3.into());
  21. assert_eq!(MAX.apply(&JsValue::undefined(), &args).unwrap(), 3);
  22. let arr = JsValue::from(Array::new());
  23. let args = Array::new();
  24. args.push(&1.into());
  25. ARRAY_PROTOTYPE2.push().apply(&arr, &args).unwrap();
  26. assert_eq!(Array::from(&arr).length(), 1);
  27. }
  28. #[wasm_bindgen(module = "tests/wasm/Function.js")]
  29. extern "C" {
  30. fn get_function_to_bind() -> Function;
  31. fn get_value_to_bind_to() -> JsValue;
  32. fn list() -> Function;
  33. fn add_arguments() -> Function;
  34. fn call_function(f: &Function) -> JsValue;
  35. fn call_function_arg(f: &Function, arg0: JsValue) -> JsValue;
  36. }
  37. #[wasm_bindgen_test]
  38. fn bind() {
  39. let f = get_function_to_bind();
  40. let new_f = f.bind(&get_value_to_bind_to());
  41. assert_eq!(call_function(&f), 1);
  42. assert_eq!(call_function(&new_f), 2);
  43. }
  44. #[wasm_bindgen_test]
  45. fn bind0() {
  46. let f = get_function_to_bind();
  47. let new_f = f.bind0(&get_value_to_bind_to());
  48. assert_eq!(call_function(&f), 1);
  49. assert_eq!(call_function(&new_f), 2);
  50. }
  51. #[wasm_bindgen_test]
  52. fn bind1() {
  53. let a_list = list();
  54. let prepended_list = a_list.bind1(&JsValue::NULL, &JsValue::from(2));
  55. assert_eq!(Array::from(&call_function(&prepended_list)).pop(), 2);
  56. let adder = add_arguments();
  57. let add_42 = adder.bind1(&JsValue::NULL, &JsValue::from(42));
  58. assert_eq!(call_function_arg(&add_42, JsValue::from(1)), 43);
  59. assert_eq!(call_function_arg(&add_42, JsValue::from(378)), 420);
  60. }
  61. #[wasm_bindgen_test]
  62. fn bind2() {
  63. let a_list = list();
  64. let prepended_list = a_list.bind2(&JsValue::NULL, &JsValue::from(2), &JsValue::from(3));
  65. let arr = Array::from(&call_function(&prepended_list));
  66. assert_eq!(arr.pop(), 3);
  67. assert_eq!(arr.pop(), 2);
  68. let adder = add_arguments();
  69. let always_69 = adder.bind2(&JsValue::NULL, &JsValue::from(66), &JsValue::from(3));
  70. assert_eq!(call_function(&always_69), 69);
  71. }
  72. #[wasm_bindgen_test]
  73. fn bind3() {
  74. let a_list = list();
  75. let prepended_list = a_list.bind3(
  76. &JsValue::NULL,
  77. &JsValue::from(2),
  78. &JsValue::from(3),
  79. &JsValue::from(4),
  80. );
  81. let arr = Array::from(&call_function(&prepended_list));
  82. assert_eq!(arr.pop(), 4);
  83. assert_eq!(arr.pop(), 3);
  84. assert_eq!(arr.pop(), 2);
  85. let adder = add_arguments();
  86. let always_69 = adder.bind2(&JsValue::NULL, &JsValue::from(66), &JsValue::from(3));
  87. assert_eq!(call_function(&always_69), 69);
  88. }
  89. #[wasm_bindgen_test]
  90. fn length() {
  91. assert_eq!(MAX.length(), 2);
  92. assert_eq!(ARRAY_PROTOTYPE2.push().length(), 1);
  93. }
  94. #[wasm_bindgen_test]
  95. fn name() {
  96. assert_eq!(JsValue::from(MAX.name()), "max");
  97. assert_eq!(JsValue::from(ARRAY_PROTOTYPE2.push().name()), "push");
  98. }
  99. #[wasm_bindgen_test]
  100. fn to_string() {
  101. assert!(MAX.to_string().length() > 0);
  102. }
  103. #[wasm_bindgen_test]
  104. fn function_inheritance() {
  105. assert!(MAX.is_instance_of::<Function>());
  106. assert!(MAX.is_instance_of::<Object>());
  107. let _: &Object = MAX.as_ref();
  108. }