--[[----------------------------------------------------------------------------

NmbLocalRenditionDigestTest.lua

--------------------------------------------------------------------------------

ADOBE CONFIDENTIAL
------------------
Copyright 2017 Adobe Systems Incorporated
All Rights Reserved.

NOTICE: All information contained herein is, and remain the property of
Adobe Systems Incorporated and its suppliers, if any. The intellectual and
technical concepts contained herein are proprietary to Adobe Systems
Incorporated and its suppliers and may be covered by U.S. and Foreign
Patents, patents in process, and are protected by trade secret or copyright
law.  Dissemination of this information or reproduction of this material is
strictly forbidden unless prior written permission is obtained from
Adobe Systems Incorporated.

------------------------------------------------------------------------------]]

	-- WF.core.self_test
local WFRxTestCase = require 'WFRxTestCase'

	-- WF.core.utils
local WFTableMerge = require "WFTableMerge"
local WFImageOrientation = require "WFImageOrientation"
local KSIdGenerator = require 'KSIdGenerator'
local KSTableUtils = require 'KSTableUtils'

	-- WF.oz_client.managed_catalog
local NmbLocalRenditionDigest = require 'NmbLocalRenditionDigest'

--============================================================================--

local originalPath = 'path/to/original.jpg'
	
local proxyPath = 'path/to/proxy.jpg'
		
local sha256 = KSIdGenerator.uuidInLowercaseHex()

local localOriginalSha256 = sha256

local localProxySha256 = sha256

local function simplifiedDocValue()

	return {

		originalPath = originalPath,
		proxyPath = proxyPath,
		sha256 = sha256,
		localOriginalSha256 = localOriginalSha256,
		localProxySha256 = localProxySha256,
	}
	
end

--------------------------------------------------------------------------------

local function rxTestSha256Changes( rxTest )

	local docValue = simplifiedDocValue( 'original' )
	
	local baselineDigest = NmbLocalRenditionDigest.computeFromRenderInfo( docValue )
	
	rxTest:expectEqual( NmbLocalRenditionDigest.computeFromRenderInfo( docValue ), baselineDigest )

	-- Changing the SHA256 of the doc should NOT cause digest to change, since the
	-- SHA256 of the original hasn't changed ( and we always prefer to render
	-- using the original ).

	docValue.sha256 = KSIdGenerator.uuidInLowercaseHex()

	rxTest:expectEqual( NmbLocalRenditionDigest.computeFromRenderInfo( docValue ), baselineDigest )
	
	-- Changing SHA256 of the original asset should force the digest to change.
	
	docValue.localOriginalSha256 = KSIdGenerator.uuidInLowercaseHex()

	rxTest:expectNotEqual( NmbLocalRenditionDigest.computeFromRenderInfo( docValue ), baselineDigest )
	
	-- Removing the Original should NOT cause the digest to change, since it has the same
	-- SHA256 as the original.

	docValue.localOriginalSha256 = nil

	rxTest:expectEqual( NmbLocalRenditionDigest.computeFromRenderInfo( docValue ), baselineDigest )

	-- Downloading an original should NOT cause the digest to change if it has the
	-- same SHA256 as the proxy.
	
	docValue.localOriginalSha256 = docValue.localProxySha256

	rxTest:expectEqual( NmbLocalRenditionDigest.computeFromRenderInfo( docValue ), baselineDigest )
	
	-- Removing original and proxy, and changing SHA of the doc should cause the asset
	-- digest to change.
	
	docValue.localOriginalSha256 = nil
	docValue.localProxySha256 = nil
	docValue.sha256 = KSIdGenerator.uuidInLowercaseHex()
	
	rxTest:expectNotEqual( NmbLocalRenditionDigest.computeFromRenderInfo( docValue ), baselineDigest )

	-- Downloading a new proxy with a new SHA should cause the digest to change.
	
	docValue.localProxySha256 = KSIdGenerator.uuidInLowercaseHex()
	
	rxTest:expectNotEqual( NmbLocalRenditionDigest.computeFromRenderInfo( docValue ), baselineDigest )

	----------------------------------------------------------------------------
	
	-- Start with a freshly imported image
	
	local importedDocValue = simplifiedDocValue( 'original' )
	importedDocValue.localProxySha256 = nil
	importedDocValue.proxyPath = nil
	importedDocValue.firstOzRevisionId = nil
	importedDocValue.ozValidOriginalLink = nil
	importedDocValue.ozProxyLink = nil

	baselineDigest = NmbLocalRenditionDigest.computeFromRenderInfo( importedDocValue )
	
	-- Uploading the asset to Oz should not cause the digest to change.
	
	importedDocValue.localProxySha256 = localProxySha256
	importedDocValue.proxyPath = proxyPath
	
	rxTest:expectEqual( NmbLocalRenditionDigest.computeFromRenderInfo( importedDocValue ), baselineDigest )
	
end

--------------------------------------------------------------------------------

local _xmpCameraRaw = [[
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c140 79.160451, 2017/05/06-01:08:21 "> 
<rdf:RDF xmlns:rdf="/www.w3.org/1999/02/22-rdf-syntax-ns#"> 
<rdf:Description rdf:about="" xmlns:crs="/ns.adobe.com/camera-raw-settings/1.0/" 
crs:Version="11.2" 
crs:ProcessVersion="6.7" 
crs:WhiteBalance="As Shot" 
crs:Temperature="2000" 
crs:Tint="-150" 
crs:Saturation="0" 
crs:Sharpness="58" 
crs:LuminanceSmoothing="23" 
crs:ColorNoiseReduction="25" 
crs:VignetteAmount="0" 
crs:ShadowTint="0" 
crs:RedHue="0" 
crs:RedSaturation="0" 
crs:GreenHue="0" 
crs:GreenSaturation="0" 
crs:BlueHue="0" 
crs:BlueSaturation="0" 
crs:Vibrance="0" 
crs:HueAdjustmentRed="0" 
crs:HueAdjustmentOrange="0" 
crs:HueAdjustmentYellow="0" 
crs:HueAdjustmentGreen="0" 
crs:HueAdjustmentAqua="0"
crs:HueAdjustmentBlue="0"
crs:HueAdjustmentPurple="0"
crs:HueAdjustmentMagenta="0"
crs:SaturationAdjustmentRed="0"
crs:SaturationAdjustmentOrange="0"
crs:SaturationAdjustmentYellow="0"
crs:SaturationAdjustmentGreen="0"
crs:SaturationAdjustmentAqua="0"
crs:SaturationAdjustmentBlue="0"
crs:SaturationAdjustmentPurple="0"
crs:SaturationAdjustmentMagenta="0"
crs:LuminanceAdjustmentRed="0"
crs:LuminanceAdjustmentOrange="0"
crs:LuminanceAdjustmentYellow="0"
crs:LuminanceAdjustmentGreen="0"
crs:LuminanceAdjustmentAqua="0"
crs:LuminanceAdjustmentBlue="0"
crs:LuminanceAdjustmentPurple="0"
crs:LuminanceAdjustmentMagenta="0"
crs:SplitToningShadowHue="0"
crs:SplitToningShadowSaturation="0"
crs:SplitToningHighlightHue="52"
crs:SplitToningHighlightSaturation="64"
crs:SplitToningBalance="0"
crs:ParametricShadows="0"
crs:ParametricDarks="0"
crs:ParametricLights="0"
crs:ParametricHighlights="0"
crs:ParametricShadowSplit="25"
crs:ParametricMidtoneSplit="50"
crs:ParametricHighlightSplit="75"
crs:SharpenRadius="+1.0"
crs:SharpenDetail="25"
crs:SharpenEdgeMasking="53"
crs:PostCropVignetteAmount="0"
crs:GrainAmount="0"
crs:LuminanceNoiseReductionDetail="50"
crs:ColorNoiseReductionDetail="50"
crs:LuminanceNoiseReductionContrast="0"
crs:ColorNoiseReductionSmoothness="50" 
crs:LensProfileEnable="1"
crs:LensManualDistortionAmount="0"
crs:PerspectiveVertical="0"
crs:PerspectiveHorizontal="0"
crs:PerspectiveRotate="0.0"
crs:PerspectiveScale="100"
crs:PerspectiveAspect="0"
crs:PerspectiveUpright="0"
crs:PerspectiveX="0.00"
crs:PerspectiveY="0.00"
crs:AutoLateralCA="1"
crs:Exposure2012="0.00"
crs:Contrast2012="0"
crs:Highlights2012="0"
crs:Shadows2012="0"
crs:Whites2012="0"
crs:Blacks2012="0"
crs:Clarity2012="0"
crs:DefringePurpleAmount="0"
crs:DefringePurpleHueLo="30"
crs:DefringePurpleHueHi="70"
crs:DefringeGreenAmount="0"
crs:DefringeGreenHueLo="40"
crs:DefringeGreenHueHi="60"
crs:Dehaze="0"
crs:ToneMapStrength="0"
crs:ConvertToGrayscale="False"
crs:OverrideLookVignette="False"
crs:ToneCurveName="Medium Contrast"
crs:ToneCurveName2012="Linear"
crs:CameraProfile="Adobe Standard"
crs:CameraProfileDigest="944968722A058A1EADE7D6E3922A771B"
crs:LensProfileSetup="LensDefaults"
crs:UprightVersion="151388160"
crs:UprightCenterMode="0"
crs:UprightCenterNormX="0.5"
crs:UprightCenterNormY="0.5"
crs:UprightFocalMode="0"
crs:UprightFocalLength35mm="35"
crs:UprightPreview="False"
crs:UprightTransformCount="6"
crs:UprightFourSegmentsCount="0"
crs:HasSettings="True"
crs:AlreadyApplied="False">
<crs:ToneCurve>
<rdf:Seq>
<rdf:li>0, 0</rdf:li>
<rdf:li>32, 22</rdf:li>
<rdf:li>64, 56</rdf:li>
<rdf:li>128, 128</rdf:li>
<rdf:li>192, 196</rdf:li>
<rdf:li>255, 255</rdf:li>
</rdf:Seq>
</crs:ToneCurve>
<crs:ToneCurveRed>
<rdf:Seq>
<rdf:li>0, 0</rdf:li>
<rdf:li>255, 255</rdf:li>
</rdf:Seq>
</crs:ToneCurveRed>
<crs:ToneCurveGreen>
<rdf:Seq>
<rdf:li>0, 0</rdf:li>
<rdf:li>255, 255</rdf:li>
</rdf:Seq>
</crs:ToneCurveGreen>
<crs:ToneCurveBlue>
<rdf:Seq>
<rdf:li>0, 0</rdf:li>
<rdf:li>255, 255</rdf:li>
</rdf:Seq>
</crs:ToneCurveBlue>
<crs:ToneCurvePV2012>
<rdf:Seq>
<rdf:li>0, 0</rdf:li>
<rdf:li>255, 255</rdf:li>
</rdf:Seq>
</crs:ToneCurvePV2012>
<crs:ToneCurvePV2012Red>
<rdf:Seq>
<rdf:li>0, 0</rdf:li>
<rdf:li>255, 255</rdf:li>
</rdf:Seq>
</crs:ToneCurvePV2012Red>
<crs:ToneCurvePV2012Green>
<rdf:Seq>
<rdf:li>0, 0</rdf:li>
<rdf:li>255, 255</rdf:li>
</rdf:Seq>
</crs:ToneCurvePV2012Green>
<crs:ToneCurvePV2012Blue>
<rdf:Seq>
<rdf:li>0, 0</rdf:li>
<rdf:li>255, 255</rdf:li>
</rdf:Seq>
</crs:ToneCurvePV2012Blue>
<crs:Look
crs:Name=""/>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta> ]]

local _videoAdjustments = {
	blacks2012 = 0,
	colorGradeBlending = 50000,
	colorGradeGlobalHue = 0,
	colorGradeGlobalLum = 0,
	colorGradeGlobalSat = 0,
	colorGradeHighlightLum = 0,
	colorGradeMidtoneHue = 0,
	colorGradeMidtoneLum = 0,
	colorGradeMidtoneSat = 0,
	colorGradeShadowLum = 0,
	contrast2012 = 0,
	exposure2012 = 0,
	geometric = {
		orientation = "rotate90CCW",
	},
	grainAmount = 0,
	highlights2012 = 0,
	hueAdjustmentAqua = 0,
	hueAdjustmentBlue = 0,
	hueAdjustmentGreen = 0,
	hueAdjustmentMagenta = 0,
	hueAdjustmentOrange = 0,
	hueAdjustmentPurple = 0,
	hueAdjustmentRed = 0,
	hueAdjustmentYellow = 0,
	incrementalTemperature = 0,
	incrementalTint = 0,
	luminanceAdjustmentAqua = 0,
	luminanceAdjustmentBlue = 0,
	luminanceAdjustmentGreen = 0,
	luminanceAdjustmentMagenta = 0,
	luminanceAdjustmentOrange = 0,
	luminanceAdjustmentPurple = 0,
	luminanceAdjustmentRed = 0,
	luminanceAdjustmentYellow = 0,
	postCropVignetteAmount = 0,
	saturation = 0,
	saturationAdjustmentAqua = 0,
	saturationAdjustmentBlue = 0,
	saturationAdjustmentGreen = 0,
	saturationAdjustmentMagenta = 0,
	saturationAdjustmentOrange = 0,
	saturationAdjustmentPurple = 0,
	saturationAdjustmentRed = 0,
	saturationAdjustmentYellow = 0,
	shadows2012 = 0,
	splitToningBalance = 0,
	splitToningHighlightHue = 0,
	splitToningHighlightSaturation = 0,
	splitToningShadowHue = 0,
	splitToningShadowSaturation = 0,
	vibrance = 0,
	whites2012 = 0,
}
--------------------------------------------------------------------------------

local function mergeAll( ... )

	local ret = {}

	for i = 1, select( "#", ... ) do

		ret = WFTableMerge.applyOverlay( ret, select( i, ... ) )

	end

	return ret

end

--------------------------------------------------------------------------------

local function rxTestIsUniqueEmptySettingsForDownloadOnlyAsset( rxTest )

	local notUniqueEmpty = {

		NmbLocalRenditionDigest.privateUnitTestExports.makeUniqueEmptySettingsForDownloadOnlyAssetImp( 
			"This string is 32 characters!!!" ),

		NmbLocalRenditionDigest.privateUnitTestExports.makeUniqueEmptySettingsForDownloadOnlyAssetImp( 
			"nah" ),

		-- this has uuid chars, but not enough
		NmbLocalRenditionDigest.privateUnitTestExports.makeUniqueEmptySettingsForDownloadOnlyAssetImp( 
			"abcedf1234567890" ),


		NmbLocalRenditionDigest.privateUnitTestExports.makeUniqueEmptySettingsForDownloadOnlyAssetImp( 
			"" ),

		"<xmp/>",

		"<xmp></xmp>",

		{},

		_xmpCameraRaw,

	}

	for _, xmp in pairs( notUniqueEmpty ) do

		rxTest:expectEqual(
			NmbLocalRenditionDigest.isUniqueEmptySettingsForDownloadOnlyAsset( xmp ),
			false )

	end

	local uniqueEmpty = 
		NmbLocalRenditionDigest.privateUnitTestExports.makeUniqueEmptySettingsForDownloadOnlyAssetImp( 
			KSIdGenerator.uuidInLowercaseHex() )

	rxTest:expectEqual(
		true,
		NmbLocalRenditionDigest.isUniqueEmptySettingsForDownloadOnlyAsset( uniqueEmpty ) )
	
end

--------------------------------------------------------------------------------
local _expectedDigestByOrientation = {
	{ photo = '2fbacff6d61f1701ec192ce2cfcb879e', video = 'b5a506480e43ec44a03fcdc838671b34' }, -- 1
	{ photo = '5d51e3d4bb84c35aab98fd8b4016d8f8', video = '65c85ccad3d45fdb4def8342ed776835' }, -- 2
	{ photo = 'db864ded73b5bc150fe016201c86c373', video = 'c6c196311079d0cb0984269acc9ce7f2' }, -- 3
	{ photo = '21bf0533bc2b7ff2ad2ce60ba7102344', video = 'cf9bb3f5815cdf62df73d1b1dd6d983c' }, -- 4
	{ photo = 'd5d398368f1c4a9cab622548556114a5', video = '64b60c735448fd52c92b5f6db04a4a82' }, -- 5
	{ photo = 'e998395aab2c30fe28cc2a135df301b8', video = 'ac07f8d1ea496f97230dc8cb1c53a127' }, -- 6
	{ photo = '697060370e0c43f44898aaa7e860d1fe', video = '2ed76db87bdb52b1338a771ec491df12' }, -- 7
	{ photo = 'f7130c95e9a42371256f84ac732077d5', video = '452ad60e88a9116fff0285ddd299b3d9' }, -- 8
}

local function rxTestDigestForCorrectOrientationByAssetType( rxTest )

	local revId = 'd5d3c23ab040483eaf89e8bd8eadd8da'
	local assetTypes = { "photo", "video" }
	
	local baseDocValue = { 
		_id = 'doc_1',
		_revId=revId,
		rating = 3,
	}
	
	local developSectionByAssetType =  { 
		video = {
			develop = {
				croppedHeight = 720,
				croppedWidth = 1280,
				adjustments = _videoAdjustments,
			}
		},
		image = {
			develop = {
				croppedHeight = 720,
				croppedWidth = 1280,
				xmpCameraRaw = _xmpCameraRaw,
			}
		}
	}
	
	for _, assetType in ipairs( assetTypes ) do
	
		local testDocValue = baseDocValue
		testDocValue.subtype = assetType	
		testDocValue.isVideo = assetType == "video"
		
		testDocValue.develop = developSectionByAssetType[ assetType ]
		
		for orientation = 1, 8 do
			local userOrientation = orientation
		
			if assetType == "video" then
				userOrientation =  WFImageOrientation.tiffOrientationToVFOrientation( userOrientation )
				KSTableUtils.setNested( testDocValue, userOrientation, 'develop', 'adjustments', 'geometric', 'orientation' )
			else
				KSTableUtils.setNested( testDocValue, userOrientation, 'develop', 'userOrientation' )
			end
			
			local calculatedDigest = NmbLocalRenditionDigest.computeFromRenderInfo( testDocValue )
			rxTest:expectEqual( calculatedDigest, _expectedDigestByOrientation[ orientation ][ assetType ])
		end
	end
end
--------------------------------------------------------------------------------

local function rxTestDigestForInvalidRenditionDownloads( rxTest )

	local revId = 'd5d3c23ab040483eaf89e8bd8eadd8da'

	local serverProvidedValidRenditions = { 
			video = {
				_serverProvidedMetadata = {
					revision_ids = {
						revId
					},
					links = {
						[ '/rels/rendition_type/360p' ] = {
							href = "/fakeyVonFakenste.in/video_notreal.mp4"
						}
					}
				}},
			image = {
				_serverProvidedMetadata = {
					revision_ids = {
						revId
					},
					links = {
						[ '/rels/rendition_type/640' ] = {
							href = "/fakeyVonFakenste.in/notreal.jpg"
						}
					}
				}
			}
		}

	local serverProvidedInvalidRenditions = { 
			video = {
				_serverProvidedMetadata = {
					links = {
						[ '/rels/rendition_type/1080p' ] = {
							href = "/fakeyVonFakenste.in/video_Invalidnotreal.mp4",
							invalid = true
						}
					}
				}
			},
			image = {
				_serverProvidedMetadata = {
					links = {
						[ '/rels/rendition_type/1280' ] = {
							href = "/fakeyVonFakenste.in/Invalidnotreal.jpg",
							invalid = true
						}
					}
				}
			}
		}

	local serverProvidedMasterDownloadLink = { 
			video = {
				_serverProvidedMetadata = {
					links = {
						[ '/rels/master' ] = {
							href = "/fakeyVonFakenste.in/video_master.mp4",
						}
					}
				}
			},
			image = {
				_serverProvidedMetadata = {
					links = {
						[ '/rels/master' ] = {
							href = "/fakeyVonFakenste.in/master.jpg",
						}
					}
				}
			}
		}
		
	local serverProvidedProxyDownloadLink = { 
			video = {
				_serverProvidedMetadata = {
					links = {
						[ '/rels/proxy_type/1080p' ] = {
							href = "/fakeyVonFakenste.in/video_proxy.mp4",
						}
					}
				}
			},
			image = {
				_serverProvidedMetadata = {
					links = {
						[ '/rels/proxy_type/2560' ] = {
							href = "/fakeyVonFakenste.in/proxy.jpg",
						}
					}
				}
			}
		}
		
	local defaultAdjustments = { 
			video = {
				develop = {
					adjustments = {},
				}
			},
			image = {
				develop = {
					xmpCameraRaw = '<xmp />',
				}
			}
		}

	local embeddedAdjustments =  { 
			video = {
				develop = {
					adjustments = _videoAdjustments,
				}
			},
			image = {
				develop = {
					xmpCameraRaw = _xmpCameraRaw,
				}
			}
		}
		
	local externalAdjustments =  { 
			video = {},
			image = {
				_serverProvidedMetadata = {
					links = {
						[ '/rels/xmp/develop' ] = {
							href = "/fakeyVonFakenste.in/develop.xmp",
						}
					}
				},
				develop = {
					xmpCameraRaw = {
						sha256 = "99b1dd7ad29e57b7c016aab7390997fb70c0b767112f9075aec7910facfc29de"
					}
				}
			}
		}
		
	local baseDocValue = { 
			video = {
				_id = 'doc_1',
				_revId=revId,
				subtype = 'video',
				rating = 3,
				develop = {
					croppedHeight = 720,
					croppedWidth = 1280,
				}
			},
			image = {
				_id = 'doc_1',
				_revId=revId,
				subtype = 'image',
				develop = {
					croppedHeight = 150,
					croppedWidth = 150,
					userOrientation = 4,
				},
				rating = 3,
			}
		}
	for _, assetType in ipairs( { 'image', 'video' } ) do
		for _, hasServerProxy in ipairs( { true, false } ) do
			for _, hasServerOrig in ipairs( { true, false } ) do
				for _, hasServerRenditions in ipairs( { true, false } ) do
					for _, isSharedAlbum in ipairs( { true, false } ) do
						for _, settingsType in ipairs( { 'none', 'default', 'embedded', 'external' } ) do

							local extraDocValueData = {}

							if hasServerProxy then

								extraDocValueData[ #extraDocValueData + 1 ] = serverProvidedProxyDownloadLink[ assetType ]

							end

							if hasServerOrig then

								extraDocValueData[ #extraDocValueData + 1 ] = serverProvidedMasterDownloadLink[ assetType ]

							end

							if hasServerRenditions then

								extraDocValueData[ #extraDocValueData + 1 ] = serverProvidedValidRenditions[ assetType ]

							end

							if settingsType == 'default' then

								extraDocValueData[ #extraDocValueData + 1 ] = defaultAdjustments[ assetType ]

							elseif settingsType == 'embedded' then

								extraDocValueData[ #extraDocValueData + 1 ] = embeddedAdjustments[ assetType ]

							elseif settingsType == 'external' and assetType ~= 'video' then

								extraDocValueData[ #extraDocValueData + 1 ] = externalAdjustments [ assetType ]

							end

							local docValue = mergeAll( baseDocValue[ assetType ], unpack( extraDocValueData ) )

							if isSharedAlbum then

								docValue._spaceId = "yass"

							end

							local docValueWithInvalidRenditions = mergeAll( docValue, serverProvidedInvalidRenditions[ assetType ] )

							local digestForValidRendition =
									NmbLocalRenditionDigest.maybeComputeFromDocValue( docValue )

							local digestForInvalidRendition =
									NmbLocalRenditionDigest.maybeComputeFromDocValue( docValueWithInvalidRenditions )

							local expectingDifferentDigests =
									not( hasServerProxy or hasServerOrig or hasServerRenditions )

							rxTest:logf( "Checking if digests are %s when hasServerProxy %s, hasServerOrig %s, hasServerRenditions %s, isSharedAlbum %s, settingsType %s,",
											expectingDifferentDigests and "different" or "same",
											hasServerProxy, hasServerOrig, hasServerRenditions, isSharedAlbum, settingsType )
							
							if expectingDifferentDigests then

								rxTest:expectNotEqual( digestForValidRendition, digestForInvalidRendition )

							else

								rxTest:expectEqual( digestForValidRendition, digestForInvalidRendition )

							end

						end
					end
				end
			end
		end
	end
end

--------------------------------------------------------------------------------


return WFRxTestCase.wrapSuite( 'NmbLocalRenditionDigestTest', {

	rxTestSha256Changes = rxTestSha256Changes,

	rxTestIsUniqueEmptySettingsForDownloadOnlyAsset = 
		rxTestIsUniqueEmptySettingsForDownloadOnlyAsset,
		
	rxTestDigestForCorrectOrientationByAssetType =
		rxTestDigestForCorrectOrientationByAssetType,

	rxTestDigestForInvalidRenditionDownloads =
		rxTestDigestForInvalidRenditionDownloads,

} )
