diff --git a/options.go b/options.go index 06c8ad7b..a162b4d8 100644 --- a/options.go +++ b/options.go @@ -57,7 +57,6 @@ func (og *SendOptions) copy() *SendOptions { if cp.ReplyMarkup != nil { cp.ReplyMarkup = cp.ReplyMarkup.copy() } - return &cp } @@ -110,16 +109,20 @@ type ReplyMarkup struct { func (r *ReplyMarkup) copy() *ReplyMarkup { cp := *r - cp.ReplyKeyboard = make([][]ReplyButton, len(r.ReplyKeyboard)) - for i, row := range r.ReplyKeyboard { - cp.ReplyKeyboard[i] = make([]ReplyButton, len(row)) - copy(cp.ReplyKeyboard[i], row) + if len(r.ReplyKeyboard) > 0 { + cp.ReplyKeyboard = make([][]ReplyButton, len(r.ReplyKeyboard)) + for i, row := range r.ReplyKeyboard { + cp.ReplyKeyboard[i] = make([]ReplyButton, len(row)) + copy(cp.ReplyKeyboard[i], row) + } } - cp.InlineKeyboard = make([][]InlineButton, len(r.InlineKeyboard)) - for i, row := range r.InlineKeyboard { - cp.InlineKeyboard[i] = make([]InlineButton, len(row)) - copy(cp.InlineKeyboard[i], row) + if len(r.InlineKeyboard) > 0 { + cp.InlineKeyboard = make([][]InlineButton, len(r.InlineKeyboard)) + for i, row := range r.InlineKeyboard { + cp.InlineKeyboard[i] = make([]InlineButton, len(row)) + copy(cp.InlineKeyboard[i], row) + } } return &cp diff --git a/options_test.go b/options_test.go index 57c5d14d..9749ad9e 100644 --- a/options_test.go +++ b/options_test.go @@ -23,7 +23,7 @@ func TestBtn(t *testing.T) { assert.Equal(t, &InlineButton{Text: "T", Login: &Login{Text: "T"}}, r.Login("T", &Login{Text: "T"}).Inline()) } -func TestReplyInline(t *testing.T) { +func TestOptions(t *testing.T) { r := &ReplyMarkup{} r.Reply( r.Row(r.Text("Menu")), @@ -36,13 +36,28 @@ func TestReplyInline(t *testing.T) { }, r.ReplyKeyboard) i := &ReplyMarkup{} - i.Inline(r.Row( - r.Data("Previous", "prev"), - r.Data("Next", "next"), + i.Inline(i.Row( + i.Data("Previous", "prev"), + i.Data("Next", "next"), )) assert.Equal(t, [][]InlineButton{{ {Unique: "prev", Text: "Previous"}, {Unique: "next", Text: "Next"}, }}, i.InlineKeyboard) + + assert.Panics(t, func() { + r.Reply(r.Row(r.Data("T", "u"))) + i.Inline(i.Row(i.Text("T"))) + }) + + assert.Equal(t, r.copy(), r) + assert.Equal(t, i.copy(), i) + + o := &SendOptions{ReplyMarkup: r} + assert.Equal(t, o.copy(), o) + + data, err := PollQuiz.MarshalJSON() + assert.NoError(t, err) + assert.Equal(t, []byte(`{"type":"quiz"}`), data) }