public static TemplateMessage ToTemplateMessage(this ITemplateMessage self)
        {
            if (self.AlternativeText == null)
            {
                throw new InvalidOperationException("The alternative text cannot be null.");
            }

            TemplateMessage templateMessage = self as TemplateMessage;

            if (templateMessage == null)
            {
                templateMessage = new TemplateMessage()
                {
                    AlternativeText = self.AlternativeText,
                };
            }

            if (self.Template == null)
            {
                throw new InvalidOperationException("The template cannot be null.");
            }

            templateMessage.Template = self.Template.ToTemplate();

            return(templateMessage);
        }
        public void Convert_TemplateMessageWithCarouselTemplate_InstanceIsPreserved()
        {
            TemplateMessage message = new TemplateMessage()
            {
                AlternativeText = "Alternative",
                Template        = new CarouselTemplate()
                {
                    Columns = new ICarouselColumn[]
                    {
                        new CarouselColumn()
                        {
                            ThumbnailUrl = new Uri("https://foo.bar"),
                            Title        = "CarouselTitle",
                            Text         = "CarouselText",
                            Actions      = new ITemplateAction[]
                            {
                                new MessageAction()
                                {
                                    Label = "PostbackLabel",
                                    Text  = "PostbackText"
                                }
                            }
                        }
                    }
                }
            };

            ISendMessage[] messages = MessageConverter.Convert(new ISendMessage[] { message });

            Assert.AreEqual(1, messages.Length);

            ITemplateMessage templateMessage = messages[0] as ITemplateMessage;

            Assert.AreEqual(message, templateMessage);

            ICarouselTemplate buttonsTemplate = templateMessage.Template as ICarouselTemplate;

            Assert.AreEqual(message.Template, buttonsTemplate);

            ICarouselColumn column = buttonsTemplate.Columns.First();

            Assert.AreEqual(column, ((CarouselTemplate)message.Template).Columns.First());
        }
        public void Convert_TemplateMessageWithButtonsTemplate_InstanceIsPreserved()
        {
            TemplateMessage message = new TemplateMessage()
            {
                AlternativeText = "Alternative",
                Template        = new ButtonsTemplate()
                {
                    ThumbnailUrl = new Uri("https://foo.bar"),
                    Title        = "ButtonsTitle",
                    Text         = "ButtonsText",
                    Actions      = new ITemplateAction[]
                    {
                        new PostbackAction()
                        {
                            Label = "PostbackLabel",
                            Text  = "PostbackText",
                            Data  = "PostbackData",
                        }
                    }
                }
            };

            ISendMessage[] messages = MessageConverter.Convert(new ISendMessage[] { message });

            Assert.AreEqual(1, messages.Length);

            ITemplateMessage templateMessage = messages[0] as ITemplateMessage;

            Assert.AreEqual(message, templateMessage);

            IButtonsTemplate buttonsTemplate = templateMessage.Template as IButtonsTemplate;

            Assert.AreEqual(message.Template, buttonsTemplate);

            ITemplateAction action = buttonsTemplate.Actions.First();

            Assert.AreEqual(action, ((ButtonsTemplate)message.Template).Actions.First());
        }
        public void Convert_TemplateMessageWithConfirmTemplate_InstanceIsPreserved()
        {
            TemplateMessage message = new TemplateMessage()
            {
                AlternativeText = "Alternative",
                Template        = new ConfirmTemplate()
                {
                    Text     = "ButtonsText",
                    OkAction = new MessageAction()
                    {
                        Label = "PostbackLabel",
                        Text  = "PostbackText"
                    },
                    CancelAction = new UriAction()
                    {
                        Label = "PostbackLabel",
                        Url   = new Uri("http://foo.bar")
                    }
                }
            };

            ISendMessage[] messages = MessageConverter.Convert(new ISendMessage[] { message });

            Assert.AreEqual(1, messages.Length);

            ITemplateMessage templateMessage = messages[0] as ITemplateMessage;

            Assert.AreEqual(message, templateMessage);

            IConfirmTemplate confirmTemplate = templateMessage.Template as IConfirmTemplate;

            Assert.AreEqual(message.Template, confirmTemplate);

            Assert.AreEqual(confirmTemplate.OkAction, ((ConfirmTemplate)message.Template).OkAction);
            Assert.AreEqual(confirmTemplate.CancelAction, ((ConfirmTemplate)message.Template).CancelAction);
        }
        internal static TemplateMessage Convert(ITemplateMessage message)
        {
            if (message.AlternativeText == null)
            {
                throw new InvalidOperationException("The alternative text cannot be null.");
            }

            if (!(message is TemplateMessage templateMessage))
            {
                templateMessage = new TemplateMessage()
                {
                    AlternativeText = message.AlternativeText,
                };
            }

            if (message.Template == null)
            {
                throw new InvalidOperationException("The template cannot be null.");
            }

            templateMessage.Template = Convert(message.Template);

            return(templateMessage);
        }