commit 76045c518f76faa700d97c13875641bd500e7a83 Author: Charles Iliya Krempeaux Date: Fri Aug 11 12:08:28 2023 -0700 initial commits diff --git a/mediarange/mediarange.go b/mediarange/mediarange.go new file mode 100644 index 0000000..b23fb8a --- /dev/null +++ b/mediarange/mediarange.go @@ -0,0 +1,196 @@ +package mediarange + +import ( + "errors" + "strings" +) + +var ( + errBadMediaRange = errors.New("bad media-range") +) + +// MediaRange represents a "media-range" as defined by IETF RFC-2616 (Hypertext Transfer Protocol — HTTP/1.1) in section 14.1. +// +// Here are some sample media-ranges: +// +// */* +// audio/* +// image/* +// text/* +// video/* +// application/x-tar +// audio/wav +// image/gif +// image/png +// text/html +// text/plain +// video/mp4 +// +// Note that some of these sample media-ranges look like media-types / mime-types: +// +// application/x-tar +// audio/wav +// image/gif +// image/png +// text/html +// text/plain +// video/mp4 +// +// But some of these sample media-ranges are not media-types / mime-types: +// +// */* +// audio/* +// image/* +// text/* +// video/* +// +// These later kinds of media-ranges (that do not look like media-types / mime-types) use the asterisk ("*") as a wild-card symbol. +// So "*/*" represents any media-type / mime-type. +// ANd "image/*" represents "image/gif", "image/png", etc. +type MediaRange struct { + typ string + subtyp string +} + +// Create creates a MediaRange. +// +// For example: +// +// // audio/ogg +// mediarange.Create("audio", "ogg") +// +// // audio/* +// mediarange.Create("audio", "*") +// +// // */* +// mediarange.Create("*", "*") +// +// Note that an empty string for mediaRangeType or mediaRangeSubType will be treated as a wild-card (i.e., "*"). +func Create(mediaRangeType string, mediaRangeSubType string) MediaRange { + mediaRangeType = strings.TrimSpace(mediaRangeType) + mediaRangeSubType = strings.TrimSpace(mediaRangeSubType) + + if "*" == mediaRangeType { + mediaRangeType = "" + } + if "*" == mediaRangeSubType { + mediaRangeSubType = "" + } + + return MediaRange{ + typ: strings.ToLower(mediaRangeType), + subtyp: strings.ToLower(mediaRangeSubType), + } +} + +// Parse parses a string and returns a MediaRange. +// +// For example: +// +// mr, err := mediarange.Parse("application/activity+json") +func Parse(value string) (MediaRange, error) { + + value = strings.TrimSpace(value) + + parts := strings.SplitN(value, "/", 2) + if 2 != len(parts) { + return MediaRange{}, errBadMediaRange + } + + var typ string = parts[0] + + var subtyp string + { + a := strings.SplitN(parts[1], ";", 2) + { + length := len(a) + if 2 != length && 1 != length { + return MediaRange{}, errBadMediaRange + } + } + + subtyp = a[0] + } + + return Create(typ, subtyp), nil +} + +// SubType returns the subtype of the media-range in its canonical form — i.e. lower-case and without spacing. +func (receiver MediaRange) SubType() string { + var typ string = receiver.typ + var subtyp string = receiver.subtyp + + if "" == typ || "*" == typ { + return "*" + } + + if "" == subtyp { + return "*" + } + + return subtyp +} + +// Type returns the type of the media-range in its canonical form — i.e. lower-case and without spacing. +func (receiver MediaRange) Type() string { + var typ string = receiver.typ + + if "" == typ { + return "*" + } + + return typ +} + +func (receiver MediaRange) Match(value string) bool { + + var typ string = receiver.Type() + if "*" == typ { + return true + } + + // Since media-types are a sub-set of media-ranges, we can do this. + var mediatype MediaRange + { + var err error + + mediatype, err = Parse(value) + if nil != err { + return false + } + } + + if mediatype.typ != typ { + return false + } + + var subtyp string = receiver.SubType() + if "*" == subtyp { + return true + } + + if mediatype.subtyp != subtyp { + return false + } + + return true +} + +// String returns the serialed media-range. +// +// For example: +// +// "text/html" == mediarange.Create("text", "html").String() +func (receiver MediaRange) String() string { + var p []byte + + var typ string = receiver.Type() + p = append(p, typ...) + + p = append(p, '/') + + var subtyp string = receiver.SubType() + p = append(p, subtyp...) + + return string(p) +} diff --git a/mediarange/mediarange_match_test.go b/mediarange/mediarange_match_test.go new file mode 100644 index 0000000..e872010 --- /dev/null +++ b/mediarange/mediarange_match_test.go @@ -0,0 +1,594 @@ +package mediarange_test + +import ( + "sourcecode.social/reiver/go-httpaccept/mediarange" + + "testing" +) + +func TestMediaRange_Match(t *testing.T) { + + tests := []struct{ + MediaType string + MediaRange mediarange.MediaRange + Expected bool + }{ + { + MediaType: "application/activity+json", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/epub+zip", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/gzip", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/json", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/pdf", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/msword", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/octet-stream", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/ogg", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/rtf", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/xhtml+xml", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/x-httpd-php", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "application/X-httpd-PHP", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "image/gif", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "image/png", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "Image/png", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "image/PnG", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "IMAGE/PNG", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "text/html", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "TEXT/html", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "text/plain", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "TEXT/PLAIN", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + { + MediaType: "xyz/banana", + MediaRange: mediarange.Create("", ""), + Expected: true, + }, + + + + { + MediaType: "application/activity+json", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/epub+zip", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/gzip", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/json", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/pdf", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/msword", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/octet-stream", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/ogg", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/rtf", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/xhtml+xml", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/x-httpd-php", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "application/X-httpd-PHP", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "image/gif", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "image/png", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "Image/png", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "image/PnG", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "IMAGE/PNG", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "text/html", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "TEXT/html", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "text/plain", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "TEXT/PLAIN", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + { + MediaType: "xyz/banana", + MediaRange: mediarange.Create("*", "*"), + Expected: true, + }, + + + + { + MediaType: "application/activity+json", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/epub+zip", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/gzip", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/json", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/pdf", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/msword", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/octet-stream", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/ogg", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/rtf", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/xhtml+xml", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/x-httpd-php", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "application/X-httpd-PHP", + MediaRange: mediarange.Create("application", "*"), + Expected: true, + }, + { + MediaType: "image/gif", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + { + MediaType: "image/png", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + { + MediaType: "Image/png", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + { + MediaType: "image/PnG", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + { + MediaType: "IMAGE/PNG", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + { + MediaType: "text/html", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + { + MediaType: "TEXT/html", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + { + MediaType: "text/plain", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + { + MediaType: "TEXT/PLAIN", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + { + MediaType: "xyz/banana", + MediaRange: mediarange.Create("application", "*"), + Expected: false, + }, + + + + { + MediaType: "application/activity+json", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/epub+zip", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/gzip", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/json", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/pdf", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/msword", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/octet-stream", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/ogg", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/rtf", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/xhtml+xml", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/x-httpd-php", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "application/X-httpd-PHP", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "image/gif", + MediaRange: mediarange.Create("image", "*"), + Expected: true, + }, + { + MediaType: "image/png", + MediaRange: mediarange.Create("image", "*"), + Expected: true, + }, + { + MediaType: "Image/png", + MediaRange: mediarange.Create("image", "*"), + Expected: true, + }, + { + MediaType: "image/PnG", + MediaRange: mediarange.Create("image", "*"), + Expected: true, + }, + { + MediaType: "IMAGE/PNG", + MediaRange: mediarange.Create("image", "*"), + Expected: true, + }, + { + MediaType: "text/html", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "TEXT/html", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "text/plain", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "TEXT/PLAIN", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + { + MediaType: "xyz/banana", + MediaRange: mediarange.Create("image", "*"), + Expected: false, + }, + + + + { + MediaType: "application/activity+json", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/epub+zip", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/gzip", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/json", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/pdf", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/msword", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/octet-stream", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/ogg", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/rtf", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/xhtml+xml", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/x-httpd-php", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "application/X-httpd-PHP", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "image/gif", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "image/png", + MediaRange: mediarange.Create("image", "png"), + Expected: true, + }, + { + MediaType: "Image/png", + MediaRange: mediarange.Create("image", "png"), + Expected: true, + }, + { + MediaType: "image/PnG", + MediaRange: mediarange.Create("image", "png"), + Expected: true, + }, + { + MediaType: "IMAGE/PNG", + MediaRange: mediarange.Create("image", "png"), + Expected: true, + }, + { + MediaType: "text/html", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "TEXT/html", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "text/plain", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "TEXT/PLAIN", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + { + MediaType: "xyz/banana", + MediaRange: mediarange.Create("image", "png"), + Expected: false, + }, + } + + for testNumber, test := range tests { + + actual := test.MediaRange.Match(test.MediaType) + expected := test.Expected + + if expected != actual { + t.Errorf("For test #%d, the actual result from trying to match the media-type against the media-range is not what was expected.", testNumber) + t.Logf("MEDIA-TYPE: %q", test.MediaType) + t.Logf("MEDIA-RANGE: %q", test.MediaRange) + t.Logf("EXPECTED: %t", expected) + t.Logf("ACTUAL: %t", actual) + continue + } + } +} diff --git a/mediarange/mediarange_parse_test.go b/mediarange/mediarange_parse_test.go new file mode 100644 index 0000000..f1814a0 --- /dev/null +++ b/mediarange/mediarange_parse_test.go @@ -0,0 +1,286 @@ +package mediarange_test + +import ( + "sourcecode.social/reiver/go-httpaccept/mediarange" + + "testing" +) + +func TestParse(t *testing.T) { + + tests := []struct{ + MediaRange string + Expected mediarange.MediaRange + }{ + { + MediaRange: "*/*", + Expected: mediarange.Create("*", "*"), + }, + + + + { + MediaRange: "*/*;q=0", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*;q=0.0", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*;q=0.5", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*;q=1", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*;q=1.0", + Expected: mediarange.Create("*", "*"), + }, + + + + { + MediaRange: "*/* ;q=0", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/* ;q=0.0", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/* ;q=0.5", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/* ;q=1", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/* ;q=1.0", + Expected: mediarange.Create("*", "*"), + }, + + + + { + MediaRange: "*/*; q=0", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*; q=0.0", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*; q=0.5", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*; q=1", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*; q=1.0", + Expected: mediarange.Create("*", "*"), + }, + + + + { + MediaRange: "*/* ; q=0", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/* ; q=0.0", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/* ; q=0.5", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/* ; q=1", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/* ; q=1.0", + Expected: mediarange.Create("*", "*"), + }, + + + + { + MediaRange: "*/*;q=0;once=1;twice=22;thrice=333;fource=4444", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*;q=0.0;once=1;twice=22;thrice=333;fource=4444", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*;q=0.5;once=1;twice=22;thrice=333;fource=4444", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*;q=1;once=1;twice=22;thrice=333;fource=4444", + Expected: mediarange.Create("*", "*"), + }, + { + MediaRange: "*/*;q=1.0;once=1;twice=22;thrice=333;fource=4444", + Expected: mediarange.Create("*", "*"), + }, + + + + { + MediaRange: "application/*", + Expected: mediarange.Create("application", "*"), + }, + { + MediaRange: "audio/*", + Expected: mediarange.Create("audio", "*"), + }, + { + MediaRange: "font/*", + Expected: mediarange.Create("font", "*"), + }, + { + MediaRange: "image/*", + Expected: mediarange.Create("image", "*"), + }, + { + MediaRange: "text/*", + Expected: mediarange.Create("text", "*"), + }, + { + MediaRange: "video/*", + Expected: mediarange.Create("video", "*"), + }, + { + MediaRange: "xyz/*", + Expected: mediarange.Create("xyz", "*"), + }, + + + + { + MediaRange: "Application/*", + Expected: mediarange.Create("application", "*"), + }, + { + MediaRange: "audIO/*", + Expected: mediarange.Create("audio", "*"), + }, + { + MediaRange: "FonT/*", + Expected: mediarange.Create("font", "*"), + }, + { + MediaRange: "IMAGE/*", + Expected: mediarange.Create("image", "*"), + }, + { + MediaRange: "tEXT/*", + Expected: mediarange.Create("text", "*"), + }, + { + MediaRange: "vIDeo/*", + Expected: mediarange.Create("video", "*"), + }, + { + MediaRange: "Xyz/*", + Expected: mediarange.Create("xyz", "*"), + }, + + + + { + MediaRange: "application/XHTML+XML", + Expected: mediarange.Create("application", "xhtml+xml"), + }, + { + MediaRange: "IMAGE/png", + Expected: mediarange.Create("image", "png"), + }, + { + MediaRange: "text/html", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "Text/html", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "TexT/html", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "tExt/html", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "teXt/html", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "texT/html", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "text/Html", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "text/hTml", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "text/htMl", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "text/htmL", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "TeXT/HTml", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "TEXT/html", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "text/HTML", + Expected: mediarange.Create("text", "html"), + }, + { + MediaRange: "TEXT/HTML", + Expected: mediarange.Create("text", "html"), + }, + } + + for testNumber, test := range tests { + + actual, err := mediarange.Parse(test.MediaRange) + if nil != err { + t.Errorf("For test #%d, did not expect an error but actually got one.", testNumber) + t.Logf("MEDIA-RANGE: %q", test.MediaRange) + t.Logf("ERROR: (%T) %s", err, err) + continue + } + + expected := test.Expected + + if expected != actual { + t.Errorf("For tset #%d, the actual resulting media-range is not what was expected.", testNumber) + t.Logf("MEDIA-RANGE: %q", test.MediaRange) + t.Logf("EXPECTED: %q %#v", expected, expected) + t.Logf("ACTUAL: %q %#v", actual, actual) + continue + } + + } +} diff --git a/mediarange/mediarange_string_test.go b/mediarange/mediarange_string_test.go new file mode 100644 index 0000000..f59d011 --- /dev/null +++ b/mediarange/mediarange_string_test.go @@ -0,0 +1,434 @@ +package mediarange_test + +import ( + "sourcecode.social/reiver/go-httpaccept/mediarange" + + "testing" +) + +func TestMediaRange_String(t *testing.T) { + + tests := []struct{ + MediaRange mediarange.MediaRange + Expected string + }{ + { + MediaRange: mediarange.Create("", ""), + Expected: "*"+"/"+"*", + }, + + + + { + MediaRange: mediarange.Create("*" , "*"), + Expected: "*"+"/"+"*", + }, + + + + { + MediaRange: mediarange.Create("application" , ""), + Expected: "application"+"/"+"*", + }, + { + MediaRange: mediarange.Create("audio" , ""), + Expected: "audio"+"/"+"*", + }, + { + MediaRange: mediarange.Create("font" , ""), + Expected: "font"+"/"+"*", + }, + { + MediaRange: mediarange.Create("image" , ""), + Expected: "image"+"/"+"*", + }, + { + MediaRange: mediarange.Create("text" , ""), + Expected: "text"+"/"+"*", + }, + { + MediaRange: mediarange.Create("video" , ""), + Expected: "video"+"/"+"*", + }, + { + MediaRange: mediarange.Create("xyz" , ""), + Expected: "xyz"+"/"+"*", + }, + + + + { + MediaRange: mediarange.Create("application" , "*"), + Expected: "application"+"/"+"*", + }, + { + MediaRange: mediarange.Create("audio" , "*"), + Expected: "audio"+"/"+"*", + }, + { + MediaRange: mediarange.Create("font" , "*"), + Expected: "font"+"/"+"*", + }, + { + MediaRange: mediarange.Create("image" , "*"), + Expected: "image"+"/"+"*", + }, + { + MediaRange: mediarange.Create("text" , ""), + Expected: "text"+"/"+"*", + }, + { + MediaRange: mediarange.Create("video" , ""), + Expected: "video"+"/"+"*", + }, + { + MediaRange: mediarange.Create("xyz" , ""), + Expected: "xyz"+"/"+"*", + }, + + + + { + MediaRange: mediarange.Create("Application" , "*"), + Expected: "application"+"/"+"*", + }, + { + MediaRange: mediarange.Create("Audio" , "*"), + Expected: "audio"+"/"+"*", + }, + { + MediaRange: mediarange.Create("Font" , "*"), + Expected: "font"+"/"+"*", + }, + { + MediaRange: mediarange.Create("Image" , "*"), + Expected: "image"+"/"+"*", + }, + { + MediaRange: mediarange.Create("Text" , ""), + Expected: "text"+"/"+"*", + }, + { + MediaRange: mediarange.Create("Video" , ""), + Expected: "video"+"/"+"*", + }, + { + MediaRange: mediarange.Create("Xyz" , ""), + Expected: "xyz"+"/"+"*", + }, + + + + { + MediaRange: mediarange.Create("APPLICATION" , "*"), + Expected: "application"+"/"+"*", + }, + { + MediaRange: mediarange.Create("AUDIO" , "*"), + Expected: "audio"+"/"+"*", + }, + { + MediaRange: mediarange.Create("FONT" , "*"), + Expected: "font"+"/"+"*", + }, + { + MediaRange: mediarange.Create("IMAGE" , "*"), + Expected: "image"+"/"+"*", + }, + { + MediaRange: mediarange.Create("TEXT" , ""), + Expected: "text"+"/"+"*", + }, + { + MediaRange: mediarange.Create("VIDEO" , ""), + Expected: "video"+"/"+"*", + }, + { + MediaRange: mediarange.Create("XYZ" , ""), + Expected: "xyz"+"/"+"*", + }, + + + + { + MediaRange: mediarange.Create("application" , "activity+json"), + Expected: "application"+"/"+"activity+json", + }, + { + MediaRange: mediarange.Create("application" , "epub+zip"), + Expected: "application"+"/"+"epub+zip", + }, + { + MediaRange: mediarange.Create("application" , "gzip"), + Expected: "application"+"/"+"gzip", + }, + { + MediaRange: mediarange.Create("application" , "java-archive"), + Expected: "application"+"/"+"java-archive", + }, + { + MediaRange: mediarange.Create("application" , "json"), + Expected: "application"+"/"+"json", + }, + { + MediaRange: mediarange.Create("application" , "ld+json"), + Expected: "application"+"/"+"ld+json", + }, + { + MediaRange: mediarange.Create("application" , "pdf"), + Expected: "application"+"/"+"pdf", + }, + { + MediaRange: mediarange.Create("application" , "msword"), + Expected: "application"+"/"+"msword", + }, + { + MediaRange: mediarange.Create("application" , "octet-stream"), + Expected: "application"+"/"+"octet-stream", + }, + { + MediaRange: mediarange.Create("application" , "ogg"), + Expected: "application"+"/"+"ogg", + }, + { + MediaRange: mediarange.Create("application" , "rtf"), + Expected: "application"+"/"+"rtf", + }, + { + MediaRange: mediarange.Create("application" , "vnd.oasis.opendocument.spreadsheet"), + Expected: "application"+"/"+"vnd.oasis.opendocument.spreadsheet", + }, + { + MediaRange: mediarange.Create("application" , "vnd.openxmlformats-officedocument.wordprocessingml.document"), + Expected: "application"+"/"+"vnd.openxmlformats-officedocument.wordprocessingml.document", + }, + { + MediaRange: mediarange.Create("application" , "vnd.mozilla.xul+xml"), + Expected: "application"+"/"+"vnd.mozilla.xul+xml", + }, + { + MediaRange: mediarange.Create("application" , "vnd.ms-excel"), + Expected: "application"+"/"+"vnd.ms-excel", + }, + { + MediaRange: mediarange.Create("application" , "x-7z-compressed"), + Expected: "application"+"/"+"x-7z-compressed", + }, + { + MediaRange: mediarange.Create("application" , "x-bzip"), + Expected: "application"+"/"+"x-bzip", + }, + { + MediaRange: mediarange.Create("application" , "x-bzip2"), + Expected: "application"+"/"+"x-bzip2", + }, + { + MediaRange: mediarange.Create("application" , "x-cdf"), + Expected: "application"+"/"+"x-cdf", + }, + { + MediaRange: mediarange.Create("application" , "x-csh"), + Expected: "application"+"/"+"x-csh", + }, + { + MediaRange: mediarange.Create("application" , "x-freearc"), + Expected: "application"+"/"+"x-freearc", + }, + { + MediaRange: mediarange.Create("application" , "x-httpd-php"), + Expected: "application"+"/"+"x-httpd-php", + }, + { + MediaRange: mediarange.Create("application" , "x-sh"), + Expected: "application"+"/"+"x-sh", + }, + { + MediaRange: mediarange.Create("application" , "x-tar"), + Expected: "application"+"/"+"x-tar", + }, + { + MediaRange: mediarange.Create("application" , "xhtml+xml"), + Expected: "application"+"/"+"xhtml+xml", + }, + + + + { + MediaRange: mediarange.Create("audio" , "aac"), + Expected: "audio"+"/"+"aac", + }, + { + MediaRange: mediarange.Create("audio" , "midi"), + Expected: "audio"+"/"+"midi", + }, + { + MediaRange: mediarange.Create("audio" , "mpeg"), + Expected: "audio"+"/"+"mpeg", + }, + { + MediaRange: mediarange.Create("audio" , "ogg"), + Expected: "audio"+"/"+"ogg", + }, + { + MediaRange: mediarange.Create("audio" , "opus"), + Expected: "audio"+"/"+"opus", + }, + { + MediaRange: mediarange.Create("audio" , "wav"), + Expected: "audio"+"/"+"wav", + }, + { + MediaRange: mediarange.Create("audio" , "webm"), + Expected: "audio"+"/"+"webm", + }, + { + MediaRange: mediarange.Create("audio" , "3gpp"), + Expected: "audio"+"/"+"3gpp", + }, + { + MediaRange: mediarange.Create("audio" , "3gpp2"), + Expected: "audio"+"/"+"3gpp2", + }, + { + MediaRange: mediarange.Create("audio" , "x-midi"), + Expected: "audio"+"/"+"x-midi", + }, + + + + { + MediaRange: mediarange.Create("font" , "ttf"), + Expected: "font"+"/"+"ttf", + }, + + + + { + MediaRange: mediarange.Create("image" , "avif"), + Expected: "image"+"/"+"avif", + }, + { + MediaRange: mediarange.Create("image" , "bmp"), + Expected: "image"+"/"+"bmp", + }, + { + MediaRange: mediarange.Create("image" , "gif"), + Expected: "image"+"/"+"gif", + }, + { + MediaRange: mediarange.Create("image" , "png"), + Expected: "image"+"/"+"png", + }, + { + MediaRange: mediarange.Create("image" , "tiff"), + Expected: "image"+"/"+"tiff", + }, + + + + { + MediaRange: mediarange.Create("text" , "css"), + Expected: "text"+"/"+"css", + }, + { + MediaRange: mediarange.Create("text" , "csv"), + Expected: "text"+"/"+"csv", + }, + { + MediaRange: mediarange.Create("text" , "html"), + Expected: "text"+"/"+"html", + }, + { + MediaRange: mediarange.Create("text" , "javascript"), + Expected: "text"+"/"+"javascript", + }, + { + MediaRange: mediarange.Create("text" , "markdown"), + Expected: "text"+"/"+"markdown", + }, + { + MediaRange: mediarange.Create("text" , "plain"), + Expected: "text"+"/"+"plain", + }, + { + MediaRange: mediarange.Create("text" , "x-markdown"), + Expected: "text"+"/"+"x-markdown", + }, + + + + { + MediaRange: mediarange.Create("video" , "3gpp2"), + Expected: "video"+"/"+"3gpp2", + }, + { + MediaRange: mediarange.Create("video" , "ogg"), + Expected: "video"+"/"+"ogg", + }, + { + MediaRange: mediarange.Create("video" , "mp2t"), + Expected: "video"+"/"+"mp2t", + }, + { + MediaRange: mediarange.Create("video" , "mp4"), + Expected: "video"+"/"+"mp4", + }, + { + MediaRange: mediarange.Create("video" , "mpeg"), + Expected: "video"+"/"+"mpeg", + }, + { + MediaRange: mediarange.Create("video" , "webm"), + Expected: "video"+"/"+"webm", + }, + { + MediaRange: mediarange.Create("video" , "x-msvideo"), + Expected: "video"+"/"+"x-msvideo", + }, + + + + { + MediaRange: mediarange.Create("application" , "ACTIVITY+JSON"), + Expected: "application"+"/"+"activity+json", + }, + { + MediaRange: mediarange.Create("audio" , "MPEG"), + Expected: "audio"+"/"+"mpeg", + }, + { + MediaRange: mediarange.Create("font" , "TTF"), + Expected: "font"+"/"+"ttf", + }, + { + MediaRange: mediarange.Create("image" , "PNG"), + Expected: "image"+"/"+"png", + }, + { + MediaRange: mediarange.Create("text" , "HTML"), + Expected: "text"+"/"+"html", + }, + { + MediaRange: mediarange.Create("video" , "OGG"), + Expected: "video"+"/"+"ogg", + }, + { + MediaRange: mediarange.Create("xyz" , "BANANA"), + Expected: "xyz"+"/"+"banana", + }, + } + + for testNumber, test := range tests { + + actual := test.MediaRange.String() + expected := test.Expected + + if expected != actual { + t.Errorf("For test #%d, the actual (serialized) stringer value is not what was expected.", testNumber) + t.Logf("MEDIA-RANGE: %#v", test.MediaRange) + t.Logf("EXPECTED: %q", expected) + t.Logf("ACTUAL: %q", actual) + continue + } + } +} diff --git a/mediarange/mediarange_subtype_test.go b/mediarange/mediarange_subtype_test.go new file mode 100644 index 0000000..6e3224a --- /dev/null +++ b/mediarange/mediarange_subtype_test.go @@ -0,0 +1,481 @@ +package mediarange_test + +import ( + "sourcecode.social/reiver/go-httpaccept/mediarange" + + "testing" +) + +func TestMediaRange_SubType(t *testing.T) { + + tests := []struct{ + MediaRange mediarange.MediaRange + Expected string + }{ + { + MediaRange: mediarange.Create("" , ""), + Expected: "*", + }, + + + + { + MediaRange: mediarange.Create("*" , "*"), + Expected: "*", + }, + + + + { + MediaRange: mediarange.Create("application" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("audio" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("font" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("image" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("text" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("video" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("xyz" , ""), + Expected: "*", + }, + + + + { + MediaRange: mediarange.Create("application" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("audio" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("font" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("image" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("text" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("video" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("xyz" , ""), + Expected: "*", + }, + + + + { + MediaRange: mediarange.Create("Application" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("Audio" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("Font" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("Image" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("Text" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("Video" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("Xyz" , ""), + Expected: "*", + }, + + + + { + MediaRange: mediarange.Create("APPLICATION" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("AUDIO" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("FONT" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("IMAGE" , "*"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("TEXT" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("VIDEO" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("XYZ" , ""), + Expected: "*", + }, + + + + { + MediaRange: mediarange.Create("application" , "activity+json"), + Expected: "activity+json", + }, + { + MediaRange: mediarange.Create("application" , "epub+zip"), + Expected: "epub+zip", + }, + { + MediaRange: mediarange.Create("application" , "gzip"), + Expected: "gzip", + }, + { + MediaRange: mediarange.Create("application" , "java-archive"), + Expected: "java-archive", + }, + { + MediaRange: mediarange.Create("application" , "json"), + Expected: "json", + }, + { + MediaRange: mediarange.Create("application" , "ld+json"), + Expected: "ld+json", + }, + { + MediaRange: mediarange.Create("application" , "pdf"), + Expected: "pdf", + }, + { + MediaRange: mediarange.Create("application" , "msword"), + Expected: "msword", + }, + { + MediaRange: mediarange.Create("application" , "octet-stream"), + Expected: "octet-stream", + }, + { + MediaRange: mediarange.Create("application" , "ogg"), + Expected: "ogg", + }, + { + MediaRange: mediarange.Create("application" , "rtf"), + Expected: "rtf", + }, + { + MediaRange: mediarange.Create("application" , "vnd.oasis.opendocument.spreadsheet"), + Expected: "vnd.oasis.opendocument.spreadsheet", + }, + { + MediaRange: mediarange.Create("application" , "vnd.openxmlformats-officedocument.wordprocessingml.document"), + Expected: "vnd.openxmlformats-officedocument.wordprocessingml.document", + }, + { + MediaRange: mediarange.Create("application" , "vnd.mozilla.xul+xml"), + Expected: "vnd.mozilla.xul+xml", + }, + { + MediaRange: mediarange.Create("application" , "vnd.ms-excel"), + Expected: "vnd.ms-excel", + }, + { + MediaRange: mediarange.Create("application" , "x-7z-compressed"), + Expected: "x-7z-compressed", + }, + { + MediaRange: mediarange.Create("application" , "x-bzip"), + Expected: "x-bzip", + }, + { + MediaRange: mediarange.Create("application" , "x-bzip2"), + Expected: "x-bzip2", + }, + { + MediaRange: mediarange.Create("application" , "x-cdf"), + Expected: "x-cdf", + }, + { + MediaRange: mediarange.Create("application" , "x-csh"), + Expected: "x-csh", + }, + { + MediaRange: mediarange.Create("application" , "x-freearc"), + Expected: "x-freearc", + }, + { + MediaRange: mediarange.Create("application" , "x-httpd-php"), + Expected: "x-httpd-php", + }, + { + MediaRange: mediarange.Create("application" , "x-sh"), + Expected: "x-sh", + }, + { + MediaRange: mediarange.Create("application" , "x-tar"), + Expected: "x-tar", + }, + { + MediaRange: mediarange.Create("application" , "xhtml+xml"), + Expected: "xhtml+xml", + }, + + + + { + MediaRange: mediarange.Create("audio" , "aac"), + Expected: "aac", + }, + { + MediaRange: mediarange.Create("audio" , "midi"), + Expected: "midi", + }, + { + MediaRange: mediarange.Create("audio" , "mpeg"), + Expected: "mpeg", + }, + { + MediaRange: mediarange.Create("audio" , "ogg"), + Expected: "ogg", + }, + { + MediaRange: mediarange.Create("audio" , "opus"), + Expected: "opus", + }, + { + MediaRange: mediarange.Create("audio" , "wav"), + Expected: "wav", + }, + { + MediaRange: mediarange.Create("audio" , "webm"), + Expected: "webm", + }, + { + MediaRange: mediarange.Create("audio" , "3gpp"), + Expected: "3gpp", + }, + { + MediaRange: mediarange.Create("audio" , "3gpp2"), + Expected: "3gpp2", + }, + { + MediaRange: mediarange.Create("audio" , "x-midi"), + Expected: "x-midi", + }, + + + + { + MediaRange: mediarange.Create("font" , "ttf"), + Expected: "ttf", + }, + + + + { + MediaRange: mediarange.Create("image" , "avif"), + Expected: "avif", + }, + { + MediaRange: mediarange.Create("image" , "bmp"), + Expected: "bmp", + }, + { + MediaRange: mediarange.Create("image" , "gif"), + Expected: "gif", + }, + { + MediaRange: mediarange.Create("image" , "png"), + Expected: "png", + }, + { + MediaRange: mediarange.Create("image" , "tiff"), + Expected: "tiff", + }, + + + + { + MediaRange: mediarange.Create("text" , "css"), + Expected: "css", + }, + { + MediaRange: mediarange.Create("text" , "csv"), + Expected: "csv", + }, + { + MediaRange: mediarange.Create("text" , "html"), + Expected: "html", + }, + { + MediaRange: mediarange.Create("text" , "javascript"), + Expected: "javascript", + }, + { + MediaRange: mediarange.Create("text" , "markdown"), + Expected: "markdown", + }, + { + MediaRange: mediarange.Create("text" , "plain"), + Expected: "plain", + }, + { + MediaRange: mediarange.Create("text" , "x-markdown"), + Expected: "x-markdown", + }, + + + + { + MediaRange: mediarange.Create("video" , "3gpp2"), + Expected: "3gpp2", + }, + { + MediaRange: mediarange.Create("video" , "ogg"), + Expected: "ogg", + }, + { + MediaRange: mediarange.Create("video" , "mp2t"), + Expected: "mp2t", + }, + { + MediaRange: mediarange.Create("video" , "mp4"), + Expected: "mp4", + }, + { + MediaRange: mediarange.Create("video" , "mpeg"), + Expected: "mpeg", + }, + { + MediaRange: mediarange.Create("video" , "webm"), + Expected: "webm", + }, + { + MediaRange: mediarange.Create("video" , "x-msvideo"), + Expected: "x-msvideo", + }, + + + + { + MediaRange: mediarange.Create("application" , "ACTIVITY+JSON"), + Expected: "activity+json", + }, + { + MediaRange: mediarange.Create("audio" , "MPEG"), + Expected: "mpeg", + }, + { + MediaRange: mediarange.Create("font" , "TTF"), + Expected: "ttf", + }, + { + MediaRange: mediarange.Create("image" , "PNG"), + Expected: "png", + }, + { + MediaRange: mediarange.Create("text" , "HTML"), + Expected: "html", + }, + { + MediaRange: mediarange.Create("video" , "OGG"), + Expected: "ogg", + }, + { + MediaRange: mediarange.Create("xyz" , "BANANA"), + Expected: "banana", + }, + + + + { + MediaRange: mediarange.Create("*" , ""), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "apple"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "BANANA"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "Cherry"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "gif"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "html"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "javascript"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "json"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "png"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "webm"), + Expected: "*", + }, + { + MediaRange: mediarange.Create("*" , "xml"), + Expected: "*", + }, + } + + for testNumber, test := range tests { + + actual := test.MediaRange.SubType() + expected := test.Expected + + if expected != actual { + t.Errorf("For test #%d, the actual canonical-subtype is not what was expected.", testNumber) + t.Logf("MEDIA-RANGE: %#v", test.MediaRange) + t.Logf("EXPECTED: %q", expected) + t.Logf("ACTUAL: %q", actual) + continue + } + } +} diff --git a/mediarange/mediarange_type_test.go b/mediarange/mediarange_type_test.go new file mode 100644 index 0000000..b66e1b9 --- /dev/null +++ b/mediarange/mediarange_type_test.go @@ -0,0 +1,434 @@ +package mediarange_test + +import ( + "sourcecode.social/reiver/go-httpaccept/mediarange" + + "testing" +) + +func TestMediaRange_Type(t *testing.T) { + + tests := []struct{ + MediaRange mediarange.MediaRange + Expected string + }{ + { + MediaRange: mediarange.Create("" , ""), + Expected: "*", + }, + + + + { + MediaRange: mediarange.Create("*" , "*"), + Expected: "*", + }, + + + + { + MediaRange: mediarange.Create("application" , ""), + Expected: "application", + }, + { + MediaRange: mediarange.Create("audio" , ""), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("font" , ""), + Expected: "font", + }, + { + MediaRange: mediarange.Create("image" , ""), + Expected: "image", + }, + { + MediaRange: mediarange.Create("text" , ""), + Expected: "text", + }, + { + MediaRange: mediarange.Create("video" , ""), + Expected: "video", + }, + { + MediaRange: mediarange.Create("xyz" , ""), + Expected: "xyz", + }, + + + + { + MediaRange: mediarange.Create("application" , "*"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("audio" , "*"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("font" , "*"), + Expected: "font", + }, + { + MediaRange: mediarange.Create("image" , "*"), + Expected: "image", + }, + { + MediaRange: mediarange.Create("text" , ""), + Expected: "text", + }, + { + MediaRange: mediarange.Create("video" , ""), + Expected: "video", + }, + { + MediaRange: mediarange.Create("xyz" , ""), + Expected: "xyz", + }, + + + + { + MediaRange: mediarange.Create("Application" , "*"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("Audio" , "*"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("Font" , "*"), + Expected: "font", + }, + { + MediaRange: mediarange.Create("Image" , "*"), + Expected: "image", + }, + { + MediaRange: mediarange.Create("Text" , ""), + Expected: "text", + }, + { + MediaRange: mediarange.Create("Video" , ""), + Expected: "video", + }, + { + MediaRange: mediarange.Create("Xyz" , ""), + Expected: "xyz", + }, + + + + { + MediaRange: mediarange.Create("APPLICATION" , "*"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("AUDIO" , "*"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("FONT" , "*"), + Expected: "font", + }, + { + MediaRange: mediarange.Create("IMAGE" , "*"), + Expected: "image", + }, + { + MediaRange: mediarange.Create("TEXT" , ""), + Expected: "text", + }, + { + MediaRange: mediarange.Create("VIDEO" , ""), + Expected: "video", + }, + { + MediaRange: mediarange.Create("XYZ" , ""), + Expected: "xyz", + }, + + + + { + MediaRange: mediarange.Create("application" , "activity+json"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "epub+zip"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "gzip"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "java-archive"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "json"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "ld+json"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "pdf"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "msword"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "octet-stream"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "ogg"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "rtf"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "vnd.oasis.opendocument.spreadsheet"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "vnd.openxmlformats-officedocument.wordprocessingml.document"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "vnd.mozilla.xul+xml"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "vnd.ms-excel"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "x-7z-compressed"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "x-bzip"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "x-bzip2"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "x-cdf"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "x-csh"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "x-freearc"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "x-httpd-php"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "x-sh"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "x-tar"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("application" , "xhtml+xml"), + Expected: "application", + }, + + + + { + MediaRange: mediarange.Create("audio" , "aac"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("audio" , "midi"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("audio" , "mpeg"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("audio" , "ogg"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("audio" , "opus"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("audio" , "wav"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("audio" , "webm"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("audio" , "3gpp"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("audio" , "3gpp2"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("audio" , "x-midi"), + Expected: "audio", + }, + + + + { + MediaRange: mediarange.Create("font" , "ttf"), + Expected: "font", + }, + + + + { + MediaRange: mediarange.Create("image" , "avif"), + Expected: "image", + }, + { + MediaRange: mediarange.Create("image" , "bmp"), + Expected: "image", + }, + { + MediaRange: mediarange.Create("image" , "gif"), + Expected: "image", + }, + { + MediaRange: mediarange.Create("image" , "png"), + Expected: "image", + }, + { + MediaRange: mediarange.Create("image" , "tiff"), + Expected: "image", + }, + + + + { + MediaRange: mediarange.Create("text" , "css"), + Expected: "text", + }, + { + MediaRange: mediarange.Create("text" , "csv"), + Expected: "text", + }, + { + MediaRange: mediarange.Create("text" , "html"), + Expected: "text", + }, + { + MediaRange: mediarange.Create("text" , "javascript"), + Expected: "text", + }, + { + MediaRange: mediarange.Create("text" , "markdown"), + Expected: "text", + }, + { + MediaRange: mediarange.Create("text" , "plain"), + Expected: "text", + }, + { + MediaRange: mediarange.Create("text" , "x-markdown"), + Expected: "text", + }, + + + + { + MediaRange: mediarange.Create("video" , "3gpp2"), + Expected: "video", + }, + { + MediaRange: mediarange.Create("video" , "ogg"), + Expected: "video", + }, + { + MediaRange: mediarange.Create("video" , "mp2t"), + Expected: "video", + }, + { + MediaRange: mediarange.Create("video" , "mp4"), + Expected: "video", + }, + { + MediaRange: mediarange.Create("video" , "mpeg"), + Expected: "video", + }, + { + MediaRange: mediarange.Create("video" , "webm"), + Expected: "video", + }, + { + MediaRange: mediarange.Create("video" , "x-msvideo"), + Expected: "video", + }, + + + + { + MediaRange: mediarange.Create("application" , "ACTIVITY+JSON"), + Expected: "application", + }, + { + MediaRange: mediarange.Create("audio" , "MPEG"), + Expected: "audio", + }, + { + MediaRange: mediarange.Create("font" , "TTF"), + Expected: "font", + }, + { + MediaRange: mediarange.Create("image" , "PNG"), + Expected: "image", + }, + { + MediaRange: mediarange.Create("text" , "HTML"), + Expected: "text", + }, + { + MediaRange: mediarange.Create("video" , "OGG"), + Expected: "video", + }, + { + MediaRange: mediarange.Create("xyz" , "BANANA"), + Expected: "xyz", + }, + } + + for testNumber, test := range tests { + + actual := test.MediaRange.Type() + expected := test.Expected + + if expected != actual { + t.Errorf("For test #%d, the actual canonical-type is not what was expected.", testNumber) + t.Logf("MEDIA-RANGEE: %#v", test.MediaRange) + t.Logf("EXPECTED: %q", expected) + t.Logf("ACTUAL: %q", actual) + continue + } + } +}