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+ render_val2 <- static_w $ .get_htmlwidget()
95+ expect_equal(class(render_val2 ), c(" anyhtmlwidget" , " htmlwidget" ))
96+
97+ dynamic_w <- AnyHtmlWidget $ new(
98+ .esm = esm ,
99+ .mode = " dynamic" ,
100+ .height = ' 400px' ,
101+ count = 1
102+ )
103+ render_val <- dynamic_w $ render(return_widget = TRUE )
104+ expect_equal(class(render_val ), c(" anyhtmlwidget" , " htmlwidget" ))
105+ render_val2 <- dynamic_w $ .get_htmlwidget()
106+ expect_equal(class(render_val2 ), c(" anyhtmlwidget" , " htmlwidget" ))
107+
108+ shiny_w <- AnyHtmlWidget $ new(
109+ .esm = esm ,
110+ .mode = " shiny" ,
111+ .height = ' 400px' ,
112+ count = 1
113+ )
114+ expect_error(shiny_w $ render(return_widget = TRUE ), " render is meant for use with static, gadget, and dynamic modes" )
115+ expect_error(shiny_w $ .get_htmlwidget(), " .get_htmlwidget is meant for use with static and dynamic modes" )
116+
117+ gadget_w <- AnyHtmlWidget $ new(
118+ .esm = esm ,
119+ .mode = " gadget" ,
120+ .height = ' 400px' ,
121+ count = 1
122+ )
123+ render_val <- gadget_w $ render(return_widget = TRUE )
124+ expect_equal(class(render_val ), c(" list" ))
125+ expect_equal(names(render_val ), c(" ui" , " server" ))
126+ expect_error(gadget_w $ .get_htmlwidget(), " .get_htmlwidget is meant for use with static and dynamic modes" )
127+
128+ })
0 commit comments