@@ -26,42 +26,123 @@ context("data_frame-C++") {
2626 }
2727
2828 test_that (" data_frame::nrow works with 0x0 dfs" ) {
29+ // From bare list
2930 SEXP x = PROTECT (Rf_allocVector (VECSXP, 0 ));
30-
31- cpp11::data_frame df (x);
32- expect_true (df.nrow () == 0 );
33-
31+ cpp11::data_frame x_df (x);
32+ expect_true (x_df.nrow () == 0 );
3433 UNPROTECT (1 );
35- }
36-
37- test_that (" data_frame::nrow works with 10x0 dfs" ) {
38- using namespace cpp11 ::literals;
39- cpp11::writable::list x (0_xl);
40- x.attr (R_RowNamesSymbol) = {NA_INTEGER, -10 };
4134
42- cpp11::data_frame df (x);
43- expect_true (df.nrow () == 10 );
35+ // From bare list with `R_RowNamesSymbol`
36+ SEXP y = PROTECT (Rf_allocVector (VECSXP, 0 ));
37+ SEXP y_row_names = PROTECT (Rf_allocVector (INTSXP, 2 ));
38+ SET_INTEGER_ELT (y_row_names, 0 , NA_INTEGER);
39+ SET_INTEGER_ELT (y_row_names, 1 , 0 );
40+ Rf_setAttrib (y, R_RowNamesSymbol, y_row_names);
41+ cpp11::data_frame y_df (y);
42+ expect_true (y_df.nrow () == 0 );
43+ UNPROTECT (2 );
44+
45+ // From classed data frame with `R_RowNamesSymbol`
46+ SEXP z = PROTECT (Rf_allocVector (VECSXP, 0 ));
47+ SEXP z_row_names = PROTECT (Rf_allocVector (INTSXP, 2 ));
48+ SET_INTEGER_ELT (z_row_names, 0 , NA_INTEGER);
49+ SET_INTEGER_ELT (z_row_names, 1 , 0 );
50+ Rf_setAttrib (z, R_RowNamesSymbol, z_row_names);
51+ SEXP z_class = PROTECT (Rf_allocVector (STRSXP, 1 ));
52+ SET_STRING_ELT (z_class, 0 , Rf_mkChar (" data.frame" ));
53+ Rf_setAttrib (z, R_ClassSymbol, z_class);
54+ cpp11::data_frame z_df (z);
55+ expect_true (z_df.nrow () == 0 );
56+ UNPROTECT (3 );
4457 }
4558
4659 test_that (" writable::data_frame::nrow works with 0x0 dfs" ) {
60+ using namespace cpp11 ::literals;
61+
62+ // From bare list
4763 SEXP x = PROTECT (Rf_allocVector (VECSXP, 0 ));
64+ cpp11::writable::data_frame x_df (x);
65+ expect_true (x_df.nrow () == 0 );
66+ UNPROTECT (1 );
4867
49- cpp11::writable::data_frame df (x);
50- expect_true (df.nrow () == 0 );
68+ // From bare list with `R_RowNamesSymbol`
69+ cpp11::writable::list y (0_xl);
70+ y.attr (R_RowNamesSymbol) = {NA_INTEGER, 0 };
71+ cpp11::writable::data_frame y_df (y);
72+ expect_true (y_df.nrow () == 0 );
73+
74+ // From classed data frame with `R_RowNamesSymbol`
75+ cpp11::writable::list z (0_xl);
76+ z.attr (R_RowNamesSymbol) = {NA_INTEGER, 0 };
77+ z.attr (R_ClassSymbol) = " data.frame" ;
78+ cpp11::writable::data_frame z_df (z);
79+ expect_true (z_df.nrow () == 0 );
80+ }
5181
52- UNPROTECT (1 );
82+ test_that (" data_frame::nrow works with 10x0 dfs" ) {
83+ // From bare list with `R_RowNamesSymbol`
84+ SEXP y = PROTECT (Rf_allocVector (VECSXP, 0 ));
85+ SEXP y_row_names = PROTECT (Rf_allocVector (INTSXP, 2 ));
86+ SET_INTEGER_ELT (y_row_names, 0 , NA_INTEGER);
87+ SET_INTEGER_ELT (y_row_names, 1 , 10 );
88+ Rf_setAttrib (y, R_RowNamesSymbol, y_row_names);
89+ cpp11::data_frame y_df (y);
90+ expect_true (y_df.nrow () == 10 );
91+ UNPROTECT (2 );
92+
93+ // From classed data frame with `R_RowNamesSymbol`
94+ SEXP z = PROTECT (Rf_allocVector (VECSXP, 0 ));
95+ SEXP z_row_names = PROTECT (Rf_allocVector (INTSXP, 2 ));
96+ SET_INTEGER_ELT (z_row_names, 0 , NA_INTEGER);
97+ SET_INTEGER_ELT (z_row_names, 1 , 10 );
98+ Rf_setAttrib (z, R_RowNamesSymbol, z_row_names);
99+ SEXP z_class = PROTECT (Rf_allocVector (STRSXP, 1 ));
100+ SET_STRING_ELT (z_class, 0 , Rf_mkChar (" data.frame" ));
101+ Rf_setAttrib (z, R_ClassSymbol, z_class);
102+ cpp11::data_frame z_df (z);
103+ expect_true (z_df.nrow () == 10 );
104+ UNPROTECT (3 );
53105 }
54106
55107 test_that (" writable::data_frame::nrow works with 10x0 dfs (#272)" ) {
56- SEXP x = PROTECT ( Rf_allocVector (VECSXP, 0 )) ;
108+ using namespace cpp11 ::literals ;
57109
58- bool is_altrep = false ;
59- R_xlen_t nrow = 10 ;
110+ // From bare list with `R_RowNamesSymbol`
111+ cpp11::writable::list y (0_xl);
112+ y.attr (R_RowNamesSymbol) = {NA_INTEGER, 10 };
113+ cpp11::writable::data_frame y_df (y);
114+ expect_true (y_df.nrow () == 10 );
115+
116+ // From classed data frame with `R_RowNamesSymbol`
117+ cpp11::writable::list z (0_xl);
118+ z.attr (R_RowNamesSymbol) = {NA_INTEGER, 10 };
119+ z.attr (R_ClassSymbol) = " data.frame" ;
120+ cpp11::writable::data_frame z_df (z);
121+ expect_true (z_df.nrow () == 10 );
60122
61123 // Manually specify `nrow` using special constructor
62- cpp11::writable::data_frame df (x, is_altrep, nrow);
124+ bool is_altrep = false ;
125+ SEXP x = PROTECT (Rf_allocVector (VECSXP, 0 ));
126+ cpp11::writable::data_frame df (x, is_altrep, 10 );
63127 expect_true (df.nrow () == 10 );
128+ UNPROTECT (1 );
129+ }
130+
131+ test_that (" data_frame::nrow works with 0x1 dfs" ) {
132+ // From bare list
133+ SEXP x = PROTECT (Rf_allocVector (VECSXP, 1 ));
134+ SET_VECTOR_ELT (x, 0 , Rf_allocVector (INTSXP, 0 ));
135+ cpp11::data_frame x_df (x);
136+ expect_true (x_df.nrow () == 0 );
137+ UNPROTECT (1 );
138+ }
64139
140+ test_that (" writable::data_frame::nrow works with 0x1 dfs" ) {
141+ // From bare list
142+ SEXP x = PROTECT (Rf_allocVector (VECSXP, 1 ));
143+ SET_VECTOR_ELT (x, 0 , Rf_allocVector (INTSXP, 0 ));
144+ cpp11::writable::data_frame x_df (x);
145+ expect_true (x_df.nrow () == 0 );
65146 UNPROTECT (1 );
66147 }
67148
0 commit comments