# frozen_string_literal: true

require 'fast_spec_helper'

RSpec.describe Banzai::ColorParser, feature_category: :markdown do
  describe '.parse' do
    context 'HEX format' do
      [
        '#abc', '#ABC',
        '#d2d2d2', '#D2D2D2',
        '#123a', '#123A',
        '#123456aa', '#123456AA'
      ].each do |color|
        it "parses the valid hex color #{color}" do
          expect(subject.parse(color)).to eq(color)
        end
      end

      [
        '#', '#1', '#12', '#12g', '#12G',
        '#12345', '#r2r2r2', '#R2R2R2', '#1234567',
        '# 123', '# 1234', '# 123456', '# 12345678',
        '#1 2 3', '#123 4', '#12 34 56', '#123456 78'
      ].each do |color|
        it "does not parse the invalid hex color #{color}" do
          expect(subject.parse(color)).to be_nil
        end
      end
    end

    context 'RGB format' do
      [
        'rgb(0,0,0)', 'rgb(255,255,255)',
        'rgb(0, 0, 0)', 'RGB(0,0,0)',
        'rgb(0,0,0,0)',  'rgb(0,0,0,0.0)',  'rgb(0,0,0,.0)',
        'rgb(0,0,0, 0)', 'rgb(0,0,0, 0.0)', 'rgb(0,0,0, .0)',
        'rgb(0,0,0,1)',  'rgb(0,0,0,1.0)',
        'rgba(0,0,0)', 'rgba(0,0,0,0)', 'RGBA(0,0,0)',
        'rgb(0%,0%,0%)', 'rgba(0%,0%,0%,0%)'
      ].each do |color|
        it "parses the valid rgb color #{color}" do
          expect(subject.parse(color)).to eq(color)
        end
      end

      [
        'FOOrgb(0,0,0)', 'rgb(0,0,0)BAR',
        'rgb(0,0,-1)', 'rgb(0,0,-0)', 'rgb(0,0,256)',
        'rgb(0,0,0,-0.1)', 'rgb(0,0,0,-0.0)', 'rgb(0,0,0,-.1)',
        'rgb(0,0,0,1.1)',  'rgb(0,0,0,2)',
        'rgba(0,0,0,)', 'rgba(0,0,0,0.)', 'rgba(0,0,0,1.)',
        'rgb(0,0,0%)', 'rgb(101%,0%,0%)'
      ].each do |color|
        it "does not parse the invalid rgb color #{color}" do
          expect(subject.parse(color)).to be_nil
        end
      end
    end

    context 'HSL format' do
      [
        'hsl(0,0%,0%)', 'hsl(0,100%,100%)',
        'hsl(540,0%,0%)', 'hsl(-720,0%,0%)',
        'hsl(0deg,0%,0%)', 'hsl(0DEG,0%,0%)',
        'hsl(0, 0%, 0%)', 'HSL(0,0%,0%)',
        'hsl(0,0%,0%,0)', 'hsl(0,0%,0%,0.0)', 'hsl(0,0%,0%,.0)',
        'hsl(0,0%,0%, 0)', 'hsl(0,0%,0%, 0.0)', 'hsl(0,0%,0%, .0)',
        'hsl(0,0%,0%,1)', 'hsl(0,0%,0%,1.0)',
        'hsla(0,0%,0%)', 'hsla(0,0%,0%,0)', 'HSLA(0,0%,0%)',
        'hsl(1rad,0%,0%)', 'hsl(1.1rad,0%,0%)', 'hsl(.1rad,0%,0%)',
        'hsl(-1rad,0%,0%)', 'hsl(1RAD,0%,0%)'
      ].each do |color|
        it "parses the valid hsl color #{color}" do
          expect(subject.parse(color)).to eq(color)
        end
      end

      [
        'hsl(+0,0%,0%)', 'hsl(0,0,0%)', 'hsl(0,0%,0)', 'hsl(0 deg,0%,0%)',
        'hsl(0,-0%,0%)', 'hsl(0,101%,0%)', 'hsl(0,-1%,0%)',
        'hsl(0,0%,0%,-0.1)', 'hsl(0,0%,0%,-.1)',
        'hsl(0,0%,0%,1.1)', 'hsl(0,0%,0%,2)',
        'hsl(0,0%,0%,)', 'hsl(0,0%,0%,0.)', 'hsl(0,0%,0%,1.)',
        'hsl(deg,0%,0%)', 'hsl(rad,0%,0%)'
      ].each do |color|
        it "does not parse the invalid hsl color #{color}" do
          expect(subject.parse(color)).to be_nil
        end
      end
    end
  end
end
