private RelativeFont ParseStyleItem(OrdinaryFormParser.RelativeFontContext context)
        {
            var fontStyle = context.fontStyle();
            var style     = _tokens.GetNumber(fontStyle.Value);

            RelativeFont font = style switch
            {
                0 => ParseFontFromConfiguration(fontStyle),
                _ => ParseStandardFont(style),
            };

            FillRelativeFont(font, context);

            return(font);
        }
        public void FontListener_FillRelativeFont_FillsRelativeFontOptionalValues(string input, RelativeFont expected)
        {
            // Given.
            var font = new AutoFont();

            var parser = CreateParser(input);
            var tree   = parser.font();

            WalkParseTree(tree);

            // When.
            TestSubject.FillRelativeFont(font, tree.relativeFont());

            // Then.
            font.Should().BeEquivalentTo(expected, opt => opt
                                         .Excluding(x => x.Type));
        }
        internal virtual void FillRelativeFont(
            RelativeFont font,
            OrdinaryFormParser.RelativeFontContext context)
        {
            var mask = (FontMask)_tokens.GetNumber(context.Mask);

            var optionalValueSequence = new[]
            {
                FontMask.Size,
                FontMask.Bold,
                FontMask.Italic,
                FontMask.Underline,
                FontMask.Strikeout,
            };

            var offset = 3;

            foreach (var flag in optionalValueSequence)
            {
                if ((mask & flag) == 0)
                {
                    continue;
                }

                var node  = context.NUMBER(offset);
                var value = _tokens.GetNumber(node);

                switch (flag)
                {
                case FontMask.Size:
                    font.Size = ParseSize(value);
                    break;

                case FontMask.Bold:
                    font.Bold = ParseBold(value);
                    break;

                case FontMask.Italic:
                    font.Italic = ParseBoolean(value);
                    break;

                case FontMask.Underline:
                    font.Underline = ParseBoolean(value);
                    break;

                case FontMask.Strikeout:
                    font.Strikeout = ParseBoolean(value);
                    break;

                default:
                    break;
                }

                offset++;
            }

            if ((mask & FontMask.FaceName) != 0)
            {
                font.FaceName = _tokens.GetString(context.FaceName);
            }

            font.Scale = (ushort)_tokens.GetNumber(context.Scale);
        }