1+ library(anyhtmlwidget )
2+
3+ esm <- "
4+ function render({ el, model }) {
5+ el.style.border = '4px solid red';
6+ let count = () => model.get('count');
7+ let btn = document.createElement('button');
8+ btn.innerHTML = `count is ${count()}`;
9+ btn.addEventListener('click', () => {
10+ model.set('count', count() + 1);
11+ model.save_changes();
12+ });
13+ model.on('change:count', () => {
14+ btn.innerHTML = `count is ${count()}`;
15+ });
16+ el.appendChild(btn);
17+ }
18+ export default { render };
19+ "
20+
21+ test_that(" counter widget can be instantiated" , {
22+ w <- AnyHtmlWidget $ new(
23+ .esm = esm ,
24+ .mode = " static" ,
25+ .height = ' 400px' ,
26+ count = 1
27+ )
28+
29+ expect_equal(w $ count , 1 )
30+
31+ # Check that getters work
32+ expect_equal(w $ .get_value(" count" ), 1 )
33+ expect_equal(w $ .get_esm(), esm )
34+ expect_equal(w $ .get_values(), list (
35+ count = 1
36+ ))
37+ expect_equal(w $ .get_width(), " 100%" )
38+ expect_equal(w $ .get_height(), ' 400px' )
39+ expect_equal(w $ .get_mode(), " static" )
40+ expect_equal(w $ .get_host(), " 0.0.0.0" )
41+ expect_true(is.numeric(w $ .get_port()))
42+
43+ # Check that setters work
44+ w $ .set_value(" count" , 3 , emit_change = FALSE )
45+ expect_equal(w $ .get_value(" count" ), 3 )
46+
47+ # Check that onChange handler works.
48+ # Create an empty list to track calls to the handler.
49+ change_list <<- list ()
50+ handle_change <- function (key , new_val ) {
51+ # Append to the list of { key, val }
52+ # pairs of tracked changes
53+ change_list <<- append(change_list ,
54+ list (list (key = key , val = new_val ))
55+ )
56+ }
57+ w $ .on_change(handle_change )
58+
59+ w $ .set_value(" count" , 5 , emit_change = FALSE )
60+ expect_equal(w $ .get_value(" count" ), 5 )
61+ expect_equal(length(change_list ), 0 )
62+
63+ w $ .set_value(" count" , 6 , emit_change = TRUE )
64+ expect_equal(w $ .get_value(" count" ), 6 )
65+ expect_equal(length(change_list ), 1 )
66+ expect_equal(change_list [[1 ]], list (key = " count" , val = 6 ))
67+
68+ w $ .set_value(" count" , 7 , emit_change = TRUE )
69+ expect_equal(w $ .get_value(" count" ), 7 )
70+ expect_equal(length(change_list ), 2 )
71+ expect_equal(change_list [[1 ]], list (key = " count" , val = 6 ))
72+ expect_equal(change_list [[2 ]], list (key = " count" , val = 7 ))
73+ })
74+
75+ test_that(" invalid mode parameter value results in error" , {
76+ expect_error(AnyHtmlWidget $ new(
77+ .esm = esm ,
78+ .mode = " INVALID" ,
79+ .height = ' 400px' ,
80+ count = 1
81+ ), " Invalid widget mode." )
82+ })
83+
84+ test_that(" render return value reflects mode" , {
85+ static_w <- AnyHtmlWidget $ new(
86+ .esm = esm ,
87+ .mode = " static" ,
88+ .height = ' 400px' ,
89+ count = 1
90+ )
91+
92+ render_val <- static_w $ render(return_widget = TRUE )
93+ expect_equal(class(render_val ), c(" anyhtmlwidget" , " htmlwidget" ))
94+
95+ dynamic_w <- AnyHtmlWidget $ new(
96+ .esm = esm ,
97+ .mode = " dynamic" ,
98+ .height = ' 400px' ,
99+ count = 1
100+ )
101+ render_val <- dynamic_w $ render(return_widget = TRUE )
102+ expect_equal(class(render_val ), c(" anyhtmlwidget" , " htmlwidget" ))
103+
104+ shiny_w <- AnyHtmlWidget $ new(
105+ .esm = esm ,
106+ .mode = " shiny" ,
107+ .height = ' 400px' ,
108+ count = 1
109+ )
110+ expect_error(shiny_w $ render(return_widget = TRUE ), " render is meant for use with static, gadget, and dynamic modes" )
111+
112+ gadget_w <- AnyHtmlWidget $ new(
113+ .esm = esm ,
114+ .mode = " gadget" ,
115+ .height = ' 400px' ,
116+ count = 1
117+ )
118+ render_val <- gadget_w $ render(return_widget = TRUE )
119+ expect_equal(class(render_val ), c(" list" ))
120+ expect_equal(names(render_val ), c(" ui" , " server" ))
121+
122+ })
0 commit comments